微信小程序开发使用onreachBottom实现页面触底加载及分页

目录

一 简要介绍一下onreachBottom事件

 二  实例展示

 三 遇到的一些问题


一 简要介绍一下onreachBottom事件

        onreachBottom和onLoad以及onShow一样,都属于小程序的生命周期事件,作用就是在页面下拉到底部时触发这个事件,一般适用于数据比较多的情况下,实现懒加载并分页展示数据。

        截图中展示了小程序对onreachBottom事件的具体解释和参数。

 二  实例展示

此次展示的实例是在小程序首页加载二手车车源信息的下拉分页加载数据的效果。

  1. 首先需要在data里面初始化分页的页数和获取的数据数组。

  2. 写好触底之后加载新数据并保留老数据的方法。我把加载第一页数据和触底加载新数据写在了一个方法里面,方法里面加入了一个布尔型的reachBottom参数,在onLoad事件里参数为false,只加载第一页;在onreachBottom事件里参数为true,要加载新的数据.
  3. 向后端请求的方法为util.request,详情可以看我上一个博客,贴个链接.这里的参数比较多,贴图

    https://blog.csdn.net/weixin_53387347/article/details/125742037?spm=1001.2014.3001.5502
  4. 将从后端请求的数据保存在supplyList中,并且通过setData方法写入data中的supplyList中,将总页数也保存在totalPages中,最后每获取一整页的数据之后将页数加一,为下页调用数据做准备.方法的整体代码如下.
    getSupplyList(reachBottom) {//参数表示是否为触底下拉加载数据
        wx.showLoading({
          title: '加载中...',
        });
        let that = this;//在回调甘薯里,this有时候不能直接用,防止出bug所初始化一个that
        util.request(api.SupplyList, {//发送请求
          type: that.data.type,
          page: that.data.page,
          limit: that.data.limit,
          searchValue: that.data.searchValue//请求的四个参数
        }).then(function (res) {
          console.log(that.data.page);
          if (res.errno === 0) {//为0请求成功
            let supplyList = res.data.list.map(item => {
              item.dueTime = util.formatTime2(new Date(item.dueTime), "Y/M/D");//设置日期格式
              item.herbListImage && (item.herbListImage01 = item.herbListImage.split(',')[0])//设置获取的图片列表
              item.companyLogo = item.companyLogo || item.avatar;
              item.companyName = item.companyName || item.nickname;
              return item;//将这一条数据返回supplyList并保存
            });
            //触底加载新数据并保留老数据
            if (reachBottom) {
              supplyList = [...that.data.supplyList, ...supplyList]//将新数据加入老数据中
            }
            that.setData({//将获取的值赋值给data中的数组和总页数
              supplyList: supplyList,
              totalPages: res.data.pages
            });
            that.data.page++//所有操作完成后页数加一
            wx.hideLoading();
          }
        }).finally(() => {
          wx.hideLoading();
        });
      },
  5. 写好getSupplyList方法之后,可以在onReachBottom触底加载事件里面进行调用,调用的时候要判断当前页是否小于总页数,小于的话进行调用,并且在每次调用后将当前页数加一,代码如下.
      onReachBottom() {//触底加载事件
        if (this.data.totalPages > this.data.page) {//判断当前也是否小于总页数
          this.setData({
            page: this.data.page + 1//当前页加一
          });
        } else {
          return false;
        }
        this.getSupplyList(true);//调用方法
      },

    这样这个触底加载的功能就已经实现了. 如图

     三 遇到的一些问题

在实际开发这个过程当中,也遇到了一些问题,可以和大家分享一下,互相学习

        在测试的时候,第一次分页加载实现了,后面都没有实现,在排查之后,发现经过第一次的分页之后this.data.page即当前页面变为了3,在刷新页面之后并没有重新初始化为1,所以要在页面每次关闭之后将页面重新赋值为1,如图.

        在写getSupplyList方法时,在data里面定义好的变量使用的时候总是显示 undefined 未定义,在csdn上查到了原因,是因为在js的一些函数或者回调函数中,直接用this可能是无法访问的,需要重新定义一个变量代替this,解决方法如下,用that代替this来使用data中的变量.

         如果要实现想动图里面那样的无感触底加载的功能,只需要在对应的json文件里面加入"onReachBottomDistance": 300,可以在离底部300的时候就开始执行触底加载事件.

欢迎大家一起讨论.

  • 13
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序scroll-view组件可以实现触底加载效果,具体实现方法如下: 首先,在wxml文件中将scroll-view组件的bindscrolltolower属性绑定到一个函数上,例如: <scroll-view bindscrolltolower="loadMoreData"> <!-- 这里是scroll-view的具体内容 --> </scroll-view> 然后,在对应的js文件中,定义loadMoreData函数来处理触底加载的逻辑: Page({ data: { // 这里是页面需要显示的数据 }, loadMoreData: function(e) { // 判断是否已经加载了全部数据,如果是则不进行加载 if (this.data.isLoadedAll) { return; } // 进行加载操作,可以发送请求获取更多的数据 wx.request({ url: 'https://example.com/loadmore', data: { // 这里是传递给后端的参数 }, success: res => { // 将获取到的新数据追加到原有数据的后面 const newData = this.data.dataList.concat(res.data.data); this.setData({ dataList: newData }); // 判断是否已经加载了全部数据,如果是则更新isLoadedAll状态为true if (res.data.isLoadedAll) { this.setData({ isLoadedAll: true }); } } }); } }); 通过上述代码,我们定义了loadMoreData函数来处理触底加载的逻辑。在函数中,首先判断是否已经加载了全部数据,如果是则返回,不进行加载操作。然后,通过wx.request发送请求获取更多的数据,将新数据追加到原有数据的后面,并更新isLoadedAll状态来判断是否已经加载了全部数据。 这样,当用户滑动至scroll-view组件的底部时,就会触发loadMoreData函数进行加载操作,实现触底加载的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值