爱善品

如果你想去一个地方,方向、方法、努力,哪个更重要呢?
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

下拉刷新、上拉加载更多(微信小程序)

Posted on 2017-01-29 21:59  爱善品  阅读(1526)  评论(0编辑  收藏  举报

下拉刷新、上拉加载更多(微信小程序)

  需求分析

      微信小程序开发,经常需要下拉刷新、上拉加载更多进行网络请求。主要的需求如下:

      (1)页面初始化时,自动下拉刷新,下拉操作时,激发下拉刷新,下拉刷新的同时,更新、显示数据。

      (2)当滑动到底部上拉时,加载更多数据,如果没有更多的数据,则提示“没有更多啦”。

      (3)交互反馈,给用户一个良好的体验。

 

  实现逻辑

     (1)用户下拉操作时,会激发onPullDownRefresh 函数。在onPullDownRefresh 函数中发起网络请求,可以实现下拉刷新,更新、显示数据。在生命周期函数onLoad中, 调用onPullDownRefresh 函数,实现页面初始化时,自动下拉刷新。

     (2)当滑动到底部上拉时,会激发onReachBottom函数。在onReachBottom函数中发起网络请求,拼接地址,实现第1次上拉加载第2页;第n次上拉,加载第(n + 1)页。如果没有更多的数据,则提示“没有更多啦”。

     (3)交互反馈:网络请求之前,使用消息提示框提示“刷新数据”、或“加载更多”,请求之后隐藏提示。下拉刷新请求之后,结束下拉刷新。

        另外,在onPullDownRefresh 函数中,将页面数据(dataList)设置为第一页数据,将页面变量(page)设置为初始值。如果用户上拉加载更多后,又下拉刷新,那么清除原来的数据,只显示新的第一页的数据,当用户再次滑动上拉时,再加载更多。

  数据接口

      第一页的数据接口:

   http://app.api.autohome.com.cn/autov5.0.0/news/newslist-pm1-c0-nt1-p1-s30-l0.json
第n页的数据接口(
lasttime是已下载数据最后一条的lasttime):
http://app.api.autohome.com.cn/autov5.0.0/news/newslist-pm1-c0-nt1-pn-s30-llasttime.json

 

  项目源码

      1、JSON文件,在window选项中开启enablePullDownRefresh

"enablePullDownRefresh": true

      2、JS文件

// 第一页数据接口
var urlPage1 = "http://app.api.autohome.com.cn/autov5.0.0/news/newslist-pm1-c0-nt1-p1-s30-l0.json";
// 定义page变量,用于实现加载更多
var page = 1;
Page({
  data: {
    dataList: []
  },
  onLoad: function (options) {
    // 调用下拉刷新函数
    this.onPullDownRefresh()
  },
  // 定义onPullDownRefresh 函数,用户下拉操作时会激发
  onPullDownRefresh: function () {
    // 开启消息提示框
    wx.showToast({
      title: '刷新数据',
      icon: 'loading',
      duration: 10000
    })
    var that = this;
    wx.request({
      url: urlPage1,
      data: {},
      method: 'GET',
      success: function (res) {
        // 将页面数据(dataList)设置为第一页数据,将页面变量(page)设置为初始值。
        that.setData({
          dataList: res.data.result.newslist
        });
        page = 1;
      },
      complete: function () {
        // 结束下拉刷新shu刷新
        // 隐藏提示框
        wx.stopPullDownRefresh()
        setTimeout(function () {
          wx.hideToast()
        }, 800)
      }
    })
  },
  // 定义onReachBottom函数,当视图滑动到底部上拉时激发
  onReachBottom: function () {
    // 因为分页加载的数据太多,无法模拟没有数据的情况,所以使用page >= 4来模拟。
    if (page < 4) {
      // 已下载数据的最后一条的lasttime
      var lasttime = this.data.dataList[this.data.dataList.length - 1].lasttime;
      var path = 'http://app.api.autohome.com.cn/autov5.0.0/news/newslist-pm1-c0-nt1-p' + (page + 1) + '-s30-l' + lasttime + '.json';
      console.log(path);
      wx.showToast({
        title: '加载更多',
        icon: 'loading',
        duration: 10000
      })
      var that = this;
      wx.request({
        url: path,
        data: {},
        method: 'GET',
        success: function (res) {
          // 将本次下载的数据,添加到dataList
          that.setData({
            dataList: that.data.dataList.concat(res.data.result.newslist)
          });
          // 下载数据时,使用(page + 1),下载数据成功时,将page += 1,可以实现第n次上拉,加载第(n + 1)页。
          page += 1;
        },
        complete: function () {
          setTimeout(function () {
            wx.hideToast()
          }, 800)
        }
      })
      //模拟没有跟多了
    } else {
      wx.showToast({
        title: '没有更多啦',
        icon: 'loading',
        duration: 1000
      })
    }
  }
})

      3、WXML文件

<block wx:for='{{dataList}}'>
  <view class='cell'>
    <image src="{{item.smallpic}}"></image>
    <view class='right-view'>
      <text class='title'>{{item.title}}</text>
      <view class='right-view-bottom'>
        <text class='time'>{{item.time}}</text>
        <text class='replycount'>{{item.replycount}}评论</text>
      </view>
    </view>
  </view>
</block>

      4、WXSS文件

.cell {
  display: flex;
  padding: 20rpx;
  border-bottom: 1rpx solid lightgray;
}

image {
  width: 200rpx;
  height: 140rpx;
  margin-right: 20rpx;
}

.right-view {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

.right-view-bottom {
  font-size: 30rpx;
}

.title {
  font-size: 38rpx;
}

.replycount {
  float: right;
}