uniapp 底部加载更多

方法一、使用组件z-paging组件

官网:介绍 | z-paging文档

代码示例:

页面代码

<z-paging ref="paging" v-model="dataList" @query="queryList">
	<view class="item" v-for="(item,index) in dataList" :key="index">
		<view class="item-title">{{item.title}}</view>
	</view>
</z-paging>

js代码

 export default {
        data() {
            return {
                dataList: []
            };
        },
        methods: {
            queryList(pageNo, pageSize) {
              	// 这里的pageNo和pageSize会自动计算好,直接传给服务器即可
              	// 这里的请求只是演示,请替换成自己的项目的网络请求,并在网络请求回调中通过                    this.$refs.paging.complete(请求回来的数组)将请求结果传给z-paging
                this.$request.queryList({ pageNo,pageSize }).then(res => {
                	// 请勿在网络请求回调中给dataList赋值!!只需要调用complete就可以了
                	this.$refs.paging.complete(res.data.list);
                }).catch(res => {
                	// 如果请求失败写this.$refs.paging.complete(false),会自动展示错误页面
                	// 注意,每次都需要在catch中写这句话很麻烦,z-paging提供了方案可以全局统一处理
                	// 在底层的网络请求抛出异常时,写uni.$emit('z-paging-error-emit');即可
                	this.$refs.paging.complete(false);
                })
            }
        },
    };

但是我在使用的时候发现,实现不了功能,不能正常的使用的情景我遇到的有这几种:1)使用组件,在子组件中使用z-paging 2)同一个页面,通过tab标签切换,多个标签都使用z-paging

方法二、使用uniapp的触底事件

  1. 在pages.json文件中,找到需要使用触底加载的页面,添加这句

"onReachBottomDistance": 50

{
	"path": "pages/tb/patientTracking/myPatient",
	"style": {
		"navigationBarTitleText": "患者追踪-我的患者",
		"navigationBarBackgroundColor": "#04BAAD",
		"navigationBarTextStyle": "white",
		"enablePullDownRefresh": true,
		"onReachBottomDistance": 50 //这个50是指距离底部50px时
	}
}

然后找到对应的页面文件,添加触底的生命钩子

// 触底事件
  onReachBottom(){
// 触底后运行的逻辑
    if (this.tabClick==1){
      this.getData(this.patientParam.pageNo,this.patientParam.pageSize)
      // console.log("到达底部x3")
    }
  },

如果是需要实现触底分页的查询,需要判断逻辑,是否到达最后一页,有多种实现方式,这里我的逻辑是,在页面中添加一个全局变量,包含分页的页码、页大小、是否可以继续请求数据,在请求之前先判断是否可以继续请求,不需要则不请求,以下是全局变量参数

patientParam:{
    pageNo:1,
    pageSize:10,
    finished:false
},

这里是请求数据的方法

    getData(pageNo,pageSize){
      // 无数据,不请求了
      if (this.patientParam.finished){
        return
      }
      if (!pageNo){
        pageNo=1
      }
      if (!pageSize){
        pageSize=10
      }
      let param=new TrackParamVO(13,pageNo,pageSize)
      listPatient(param).then((res)=>{
        // console.log(res.length);
        // 请求还有数据
        if (res&&res.length>0){
          this.patientList.push(...res)
        }else {
          this.patientParam.finished=true
        }
        if (res.length<=this.patientParam.pageSize){
          this.patientParam.pageNo++
        }else {
          this.patientParam.finished=true
        }
      }).catch((res) => {
        console.log("下一页请求失败")
      });

具体的逻辑根据自己的需求修改,大原则就是判断是否可以请求数据和分页页码的递增;每次请求到的数据拼接到现有数据的数组尾部

### UniApp触底加载更多失败的解决方案 在UniApp开发过程中,如果遇到触底加载功能失效的情况,可以按照以下方式排查并解决问题。 #### 1. 确认页面结构是否支持滚动 确保当前页面的内容高度大于视窗高度,否则即使设置 `onReachBottom` 方法也无法触发。可以通过调整样式来验证这一点: ```css /* 修改body样式 */ body { height: auto; } ``` 上述修改解决了因固定高度导致无法正常监听滚动到底部的问题[^3]。 #### 2. 设置 loading 状态优化体验 为了避免频繁请求或者数据未准备好时引发异常,在加载新数据之前应加入 loading 状态控制逻辑。例如通过 Vue 的条件渲染指令实现: ```html <view v-if="!loading && list.length > 0"> <!-- 数据展示区域 --> </view> <view v-else-if="loading">正在加载...</view> <view v-else>暂无数据</view> ``` 此方法能够有效提升用户体验,并防止错误发生[^1]。 #### 3. 正确配置 onReachBottom 方法 确认已在合适位置定义了 `onReachBottom` 函数用于处理触底事件。通常情况下会在该函数内部执行异步请求获取额外的数据项: ```javascript methods:{ loadMore(){ if(this.loading || this.noMoreData){ return ; } this.loading = true; setTimeout(() => { //模拟网络延迟 let newData=[...Array(10).keys()].map(i=>({id:i,name:`item${i}`})); this.list.push(...newData); this.loading=false; if(newData.length < 10){ //假设每次最多返回10条记录 this.noMoreData=true; } },1500); } }, onReachBottom:function(){ console.log('reach bottom'); this.loadMore(); } ``` 以上代码片段展示了如何利用定时器模拟服务器响应过程以及动态更新列表内容的过程[^2]。 #### 4. 初始化数据加载机制 为了保证初次进入页面即可显示部分内容而不是空白界面等待全部资源下载完毕才呈现给用户查看,则可以在组件创建初期即发起一次初步查询操作: ```javascript onLoad(options){ this.id=options.id||''; this.initList(); }, initList:async function(){ try{ const res=await someApiCall(this.id); this.list=res.data; }catch(err){ console.error('Failed to fetch initial data',err); }finally{ this.loading=false; } } ``` 这里演示了一个简单的基于 Promise 的 API 调用流程,并且将结果赋值给了本地变量 `list`, 同时关闭初始加载动画[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值