从零开始做小程序(五)——触底加载、下拉刷新

一、触底加载

小程序和后台系统相对比:
相似的是:后台系统中是有表格分页的、点击页码去请求接口得到其他页的数据,而小程序是通过触底加载去请求接口得到分页数据。
不同的是:后台系统不需要自己对数据进行存储处理,后台请求得到了什么数据就显示什么数据,而 小程序需要把之前请求到的分页数据进行存储并拼接之后请求到的分页数据。

1.1、

在这里插入图片描述
触底加载不需要设置什么,只需要在页面的js中监听onReachBottom函数

<!--pages/article/article.wxml-->
<text>pages/article/article.wxml</text>
<view>
  <block wx:for="{{articleList}}" wx:key="articleId">
    <view>显示内容...</view>
  </block>
  <view class="loading" wx:if="{{loading}}" hidden="{{!show}}">
    <van-loading type="spinner" size="24px" />
    <view style="margin-left:25rpx">正在加载</view>
  </view>
  <view class="loaded" wx:else hidden="{{!show}}">加载完成</view>
  <view class="empty" wx:if="{{isEmpty}}">
    <empty />
  </view>
</view>
// pages/article/article.js
let timeout//定时器

Page({

  /**
   * 页面的初始数据
   */
  data: {
    pageIndex: 1,//当前第几页
    pageRows: 10,//每页条数
    show: false,//是否触发触底加载
    loading: true,//数据是否在加载中
    articleList: [],//文章列表
    isEmpty: false,//是否显示暂无数据
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.getInfoList()
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
    clearTimeout(timeout)
    timeout = null
  },

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

    //延时加载
    timeout = setTimeout(() => {
      this.getInfoList()
    }, 500)
  },

  //假设getInfo为后台接口
  //后台数据接口类型为
  /**
   * {
   *  code:0,
   *  data : {
   *      list:[],
   *      pager:{}
   *  }
   * }
   */
  getInfoList() {
    const { pageIndex, pageRows } = this.data;
    getInfo({ pageIndex, pageRows }).then(res => {
      if (res.code == 0 && res.data) {
        if (!res.data.list) return

        let currentIndex = res.data.pager.pageIndex;
        //后台返回的当前第几页
        let totalRows = res.data.pager.totalRows;
        //后台返回的总记录数
        if (this.data.articleList.length === totalRows) {
          if (totalRows === 0) {
            this.setData({
              isEmpty: true
            })
          }
          //如果数据已经加载完成,不让其继续执行
          return
        }

        let tempList = JSON.parse(JSON.stringify(res.data.list))
        let nextIndex = tempList.length < 10 ? currentIndex : currentIndex + 1;
        //如果最后一页数据没有加载完成,再次触底还是请求该页数据
        let arrayList = [...this.data.articleList, ...tempList]
        this.setData({
          articleList: arrayList,
          pageIndex: nextIndex,
          loading: arrayList.length != totalRows,
          isEmpty: arrayList.length <= 0
        })
      }
    })
  }

})

二、下拉刷新

在这里插入图片描述

2.1、在json文件中开启enablePullDownRefresh

在这里插入图片描述

2.1、代码

<!--pages/article/article.wxml-->
<text>pages/article/article.wxml</text>
<loading show="{{showLoading}}" />
<view>
  <block wx:for="{{articleList}}" wx:key="articleId">
    <view>显示内容...</view>
  </block>
</view>
// pages/article/article.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    pageIndex: 1,//当前第几页
    pageRows: 10,//每页条数
    articleList: [],//文章列表
    showLoading: true,//刷新loading,刚进入界面loading,得到数据后设为false
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.getInfoList()
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
    this.setData(
      {
        articleList: [],
        pageIndex: 1,
        showLoading: true,
      }, () => {
        this.getInfoList()
      }
    )
  },

  //假设getInfo为后台接口
  //后台数据接口类型为
  /**
   * {
   *  code:0,
   *  data : {
   *      list:[],
   *      pager:{}
   *  }
   * }
   */
  getInfoList() {
    const { pageIndex, pageRows } = this.data;
    getInfo({ pageIndex, pageRows }).then(res => {
      this.setData({ showLoading: false })
      wx.stopPullDownRefresh() //得到数据后停止当前页面的下拉刷新
      if (res.code == 0 && res.data) {
        //数据处理
      }
    }).catch(() => {
      //当请求接口报错的时候不让其一直处于loading状态
      this.setData({ showLoading: false })
    })
  }

})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值