微信小程序分页加载

分页加载功能大家遇到的应该会经常遇到,应用场景也很多,例如微博,QQ,微信朋友圈以及新闻类应用,都会有分页加载的功能,这不仅节省了我们用户的流量,还提升了用户体验。那么今天的这篇文章就是介绍微信小程序中如何实现分页加载的功能。照例先上源码及效果图。

源码传送门

music.gif

要实现这样的功能,一般需要在请求数据时加入当前请求页数,以及页的大小(每页显示的数量)也有一部分接口是通过请求的开始偏移量和结束偏移量请求数据,例如你一页显示10条数据,第一次(第一页)请求即开始start为0结束end是9,第二页就是从10到19,以此类推。

既然要实现分页加载功能,最重要就是下拉以及上拉的处理事件,在微信小程序中已经帮我们封装好了上拉以及下拉的触发事件,如下

/**
 * 页面相关事件处理函数--监听用户下拉动作
 */
  onPullDownRefresh: function () {
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
  },

可能刚接触微信小程序的爱好者,会遇到一个问题,为什么我重写了上拉和下拉函数,但是当我上拉或者下拉的时候函数为什么不回调啊。莫急莫慌,那是因为除了重写这两个函数,我们还需要在json配置文件加入下面代码

{
    "enablePullDownRefresh": true
}

有了上面的代码,我们每次上拉或者下拉就会触发相对应的函数了。
在data中创建数据

  data: {
    page: 1,
    pageSize: 30,
    hasMoreData: true,
    contentlist: [],
  },

page即为当前请求数据时第几页,pageSize是每页的数据的大小,hasMoreData用于上拉的时候是不是要继续请求数据,即是不是还有更多数据。当我们网络请求数据成功后,如果请求数据的长度小于pageSize: 30,那么就表示没有更多数据,将hasMoreData更改为false,如果请求的数据长度是30,表示还有更多数据那么hasMoreData久更改为true,并将页数page加1.当下拉的时候讲page先更改为1,然后去查询数据,当查询数据成功时,如果page为1,就将获取的数据直接赋值给contentlist,如果页数大于1的话,就将请求的数据追加在contentlist后面。这样就可以实现分页加载的功能了。

经过上面的分析,我们已经对分页加载的实现有了一个清晰的认识,那么接下来我就介绍代码的实现。

 getMusicInfo: function (message) {
    var that = this
    var data = {
      showapi_appid: '25158',
      showapi_sign: 'c0d685445898438f8c12ee8e93c2ee74',
      keyword: '我',
      page: that.data.page
    }
    network.requestLoading('https://route.showapi.com/213-1', data, message, function (res) {
      console.log(res)
      var contentlistTem = that.data.contentlist
      if (res.showapi_res_code == 0) {
        if (that.data.page == 1) {
          contentlistTem = []
        }
        var contentlist = res.showapi_res_body.pagebean.contentlist
        if (contentlist.length < that.data.pageSize) {
          that.setData({
            contentlist: contentlistTem.concat(contentlist),
            hasMoreData: false
          })
        } else {
          that.setData({
            contentlist: contentlistTem.concat(contentlist),
            hasMoreData: true,
            page: that.data.page + 1
          })
        }
      } else {
        wx.showToast({
          title: res.showapi_res_error,
        })
      }

    }, function (res) {
      wx.showToast({
        title: '加载数据失败',
      })

    })
  },

上面函数就是获取音乐列表信息的请求处理逻辑,该函数有一个参数message,它是用来展示加载数据时的提示信息,例如当下拉的时候,提示信息为正在刷新数据,当上拉的时候提示正在加载更多数据。
那么我们当进入页面的时候开始加载一次数据,即在onLoad函数,如下

  onLoad: function (options) {
    // 页面初始化 options为页面跳转所带来的参数
    var that = this
    that.getMusicInfo('正在加载数据...')
  },

然后上拉和下拉函数的实现如下

  /**
 * 页面相关事件处理函数--监听用户下拉动作
 */
  onPullDownRefresh: function () {
    this.data.page = 1
    this.getMusicInfo('正在刷新数据')
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
    if (this.data.hasMoreData) {
      this.getMusicInfo('加载更多数据')
    } else {
      wx.showToast({
        title: '没有更多数据',
      })
    }
  },
<think>嗯,用户想了解微信小程序中实现数据分页加载的方法和示例代码。首先,我需要回忆一下分页加载的基本概念,以及在小程序中的常见实现方式。分页加载主要是为了处理大量数据,避免一次性加载所有数据导致的性能问题。根据用户提供的引用资料,分页通常涉及页码(pageIndex)和每页数量(pageSize),或者使用偏移量(offset)和数量(limit)的方式。 接下来,用户提到的引用内容中提到了几个关键点。比如引用[2]提到直接将数据拼接到现有数组可能导致数据超过微信的大小限制,出现传输异常。这说明在实现分页时,需要注意数据拼接的方式,可能需要分页请求而不是累积数据。引用[3]和[4]则提到了使用scroll-view组件的bindscrolltolower事件和页面的onReachBottom生命周期函数来触发加载更多数据。这两种方法都是常见的滚动到底部加载更多的方式。 然后,我需要整理实现分页的基本步骤。首先,定义分页参数,比如当前页码和每页数量。其次,处理分页请求,每次请求新数据后更新页码。接着,数据拼接方面,可能需要将新数据追加到现有列表中,但要注意避免数据过大,引用[2]提到的问题,所以可能需要分页请求而不是无限追加。另外,加载状态和没有更多数据的处理也很重要,避免重复请求或无效请求。 用户提供的引用[4]和[5]中有具体的代码示例,可以借鉴这些代码的结构。比如,在data中定义proArr作为数据列表,pageIndex作为当前页码,hasMore判断是否还有更多数据。在onLoad中初始化数据,然后在onReachBottom中触发加载更多。请求数据时,使用pageIndex和pageSize作为参数,请求成功后更新数据列表和页码,并检查是否还有更多数据。 需要注意的几个问题:1. 数据拼接时使用concat方法合并数组,但要注意总数据量不要超过限制,可能需要定期清理旧数据或分页缓存。2. 加载状态(loading)的使用,防止多次触发请求。3. 没有更多数据时(hasMore为false),停止继续请求。4. 使用scroll-view或页面事件的不同实现方式,引用[3]提到的是scroll-view的bindscrolltolower,而引用[4]使用的是页面的onReachBottom,两者需要不同的组件和事件绑定。 此外,引用[5]中的示例代码展示了如何发起分页请求,传递pageindex和callbackcount(即每页数量)参数,并在成功回调后处理数据。这可以作为参考,结合当前小程序的API进行调整,比如使用wx.request或最新的云开发API。 总结实现步骤:1. 定义分页参数和状态变量。2. 初始化加载第一页数据。3. 监听滚动到底部事件,触发加载更多。4. 发起请求获取新数据,处理响应,更新数据和状态。5. 处理加载中和无更多数据的状态显示。 最后,还需要考虑错误处理,比如网络请求失败时的重试机制,以及用户体验方面的加载提示(如引用[4]中的loading状态)。同时,根据引用[2]的提示,如果数据量过大,可能需要后端支持分页查询,避免前端处理大量数据导致的问题。</think>### 微信小程序实现数据分页加载的示例与解析 #### 一、实现逻辑 微信小程序分页加载的核心是**分页请求**和**数据拼接**,需结合以下要素: - **分页参数**:使用$pageIndex$(当前页码)和$pageSize$(每页数量)或$offset$(偏移量)控制请求范围[^3] - **滚动监听**:通过`scroll-view`组件的`bindscrolltolower`事件或页面的`onReachBottom`生命周期函数触发加载[^3][^4] - **数据合并**:使用`concat()`方法将新数据追加到现有数组,避免超出微信数据传输长度限制(最大1048576字节)[^2] #### 二、完整代码示例 ```javascript // page.js Page({ data: { list: [], // 数据列表 pageIndex: 1, // 当前页码 pageSize: 15, // 每页数量 hasMore: true, // 是否还有更多数据 loading: false // 加载状态 }, // 初始加载 onLoad() { this.loadData() }, // 加载数据方法 loadData() { if (!this.data.hasMore || this.data.loading) return this.setData({ loading: true }) // 模拟API请求(替换为实际请求) wx.request({ url: 'https://api.example.com/list', data: { page: this.data.pageIndex, size: this.data.pageSize }, success: (res) => { const newList = res.data.items this.setData({ list: this.data.list.concat(newList), pageIndex: this.data.pageIndex + 1, hasMore: newList.length >= this.data.pageSize }) }, complete: () => { this.setData({ loading: false }) } }) }, // 页面上拉触底事件 onReachBottom() { this.loadData() } }) ``` #### 三、关键实现点 1. **分页参数传递** 请求时携带$pageIndex$和$pageSize$参数,例如: $$ \text{第n页数据范围} = (pageIndex-1) \times pageSize \sim pageIndex \times pageSize $$ 2. **数据拼接优化** 使用`concat()`合并数组而非直接修改原数组: ```javascript // 正确方式 this.setData({ list: oldList.concat(newList) }) ``` 3. **加载状态控制** 通过`loading`标志位防止重复请求,当接口返回数据量小于$pageSize$时设置`hasMore: false`[^4] 4. **滚动容器配置** 使用`scroll-view`时需要指定高度并开启纵向滚动: ```html <scroll-view style="height: 100vh" scroll-y bindscrolltolower="loadData"> <!-- 数据列表 --> </scroll-view> ``` #### 四、性能优化建议 1. **虚拟列表**:对超长列表使用`recycle-view`组件减少内存占用 2. **数据缓存**:使用`wx.setStorage`缓存已加载数据 3. **请求防抖**:在`loadData`方法中加入定时器防止频繁触发
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值