【下拉刷新 + 触底加载 】使用的是uni-app自带的 scroll-view 组件
文档地址 : https://uniapp.dcloud.io/component/scroll-view?id=scroll-view
scroll-view 需要使用到的几个api :
| api 属性名 | 说明 |
|---|---|
| scroll-y | 允许纵向滚动 |
| refresher-enabled | 开启自定义下拉刷新 |
| refresher-triggered | 设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发 |
| @refresherrefresh | 自定义下拉刷新被触发 |
| @scrolltolower | 滚动到底部/右边,会触发 scrolltolower 事件 |
| refresher-background | 设置自定义下拉刷新区域背景颜色 |
注意事项:
使用竖向滚动时,需要给
【触底加载】 这里需要配合使用 uView 的 loadMore 组件
文档地址 : https://www.uviewui.com/components/loadMore.html
loadMore 需要使用到的api :
| api 属性名 | 说明 | 可选值 |
|---|---|---|
| status | 组件状态 | 加载前值为 loadmore 加载中值为 loading 没有数据为 nomore |
页面交互判断逻辑:
- 下拉刷新
触发拉下刷新的回调函数 @refresherrefresh 在这个函数中,要做的几个动作 :
配置刷新状态 refresher-triggered = true -> await 重新加载数据 -> refresher-triggered = false
- 触底加载的动作:
通过数据总条数 和 当前数据条数,配置 u-loadmore 的 status 控制底部显示文字
@scrolltolower 回调 触发 加载更多数据
code 如下
<template><view class="meetingContent"><scroll-view scroll-y="true" refresher-enabled @refresherrefresh="onRefresh"refresher-background="rgba(244, 246, 248, 1)" :refresher-triggered="triggered" @scrolltolower="scrolltolower"><u-empty v-if="!loading && total === 0" /><template v-else><view v-for="item in meetingList" :key="item.id"><u-gap height="20" bg-color="rgba(244, 246, 248, 1)" /><meeting-card :info="item"></meeting-card></view><u-loadmore :status="loadMoreStatus" /></template></scroll-view></view></template><script>// MeetingCard 是UI组件,这里可以随便替换成自己的demo结构import MeetingCard from '../components/meetingCard.vue';export default {data: () => ({loading: true, // 暂无数据 flagtotal: 0,loadMoreStatus: "loadmore",reloadStatus: false, // 数据重新加载 flagtriggered: false, // 下拉状态current: 1,meetingList: [],}),methods: {fetchCardListData() { // 获取界面数据console.log('this.fetchCardListData -- params',this.searchParams)console.log('获取页面数据呢')this.loading = true;const resData = [{id: '1zxd',status: 1,checkTime: 1624772266174,createName: '王伟',meetingName: '【监理例会】会议纪要20210509',meetingOrg: '重庆十八梯项目',riskKey: '劳动力不足,机械不足,材料不足',riskType: '质量、安全、人员履职、环境'}, {id: 'sdfsafd',status: 2,checkTime: 1624772266174,createName: '王伟',meetingName: '【监理例会】会议纪要20210509',meetingOrg: '重庆十八梯项目',riskKey: '劳动力不足,机械不足,材料不足',riskType: '质量、安全、人员履职、环境'}]// 判断是下拉刷新 还是 触底更多if(this.reloadStatus){this.meetingList = resData}else{this.meetingList = this.meetingList.concat(resData);}this.loading = false;this.total = 3;// 判断是否可以触底加载this.meetingList.length < this.total ? this.loadMoreStatus = 'loadmore' : this.loadMoreStatus = "nomore";this.reloadStatus = false;this.loading = false;},reloadData() { // 重新加载数据 fnthis.current = 1;this.reloadStatus = true;this.meetingList = [];return this.fetchCardListData();},async onRefresh() { // 下拉刷新被触发console.log('下拉触发')this.triggered = true;await this.reloadData();this.triggered = false;},scrolltolower() { // 滚动到最底部 触底加载console.log('触底加载')if (this.meetingList.length < this.total) {this.loadMoreStatus = "loading";this.current++;this.fetchCardListData();} else {this.loadMoreStatus = "nomore";}}}}</script><style lang="scss" scoped>.meeting_wrap{height: 100%;}.meetingContent {flex: auto;overflow: hidden;height:900rpx;}scroll-view {height: 100%;}</style>
运行效果:
初始化 ->
下拉 :

