微信小程序使用scroll-view,实现分页加载和下拉刷新

bindscrolltolower="lower"   分页加载

bindrefresherrefresh="fresh"   下拉刷新

refresher-enabled="true"   开启自定义下拉刷新

refresher-triggered="{{triggered}}"  设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发,是动态控制的(开始的时候不知道,定义了其他变量freshOrNot做的控制…后来也没修改反正是)

页面代码示例如下:

.wxml

<scroll-view class="slideContent" 
   style="height:{{carsHeight}}rpx"
   scroll-y="true"
   bindscrolltolower="lower"
   bindrefresherrefresh="fresh"
   refresher-enabled="true"
   refresher-triggered="{{triggered}}">
  ----放置请求信息----
</scroll-view>

.js文件

因图片是其他接口返回,没有同人员列表一起返回,所以做的promise,没有可以忽略。

Page({

  /**
   * 页面的初始数据
   */
  data: {
    carsHeight: 0, //列表滚动区高度
    drivers: [], //列表数据
    keyWord: '', //模糊查询
    pageNum: 1, //初始页数
    pageSize: 10, //初始条数
    stopLoadMoreTiem: false, //阻止多次触发上拉刷新需要的变量(是否分页)
    triggered: true, //是否开始自定义下拉刷新()
    freshOrNot: 1, //当分页和下拉加载一同进行时,是否允许下拉加载 1默认下拉可加载,0不可加载
    addDriversOrNot: 1, //当分页和下拉加载一同进行时,是否允许数据累加 1累加 0不累加
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {

    //获取视口高度
    let that = this;
    wx.getSystemInfo({
      success: function (res) {
        // 获取可使用窗口宽度
        let clientHeight = res.windowHeight;
        // 获取可使用窗口高度
        let clientWidth = res.windowWidth;
        // 算出比例
        let ratio = 750 / clientWidth;
        // 算出高度(单位rpx) - 固定元素的高度滚动区高度
        let carsHeight = clientHeight * ratio - 78 - 60;
        that.setData({
          carsHeight: carsHeight,
        })
      }
    });
    //页面初始数据
    this.getSelectIdleDrivers()
  },

  //处理子组件获取的值,返回给办公车申请页
  manChoise(e) {
    let pages = getCurrentPages();
    let prevPage = pages[pages.length - 2]; //上一个页面
    //直接调用上一个页面的setData()方法,把数据存到上一个页面中去
    prevPage.setData({
      'tripInformation.driverNo': e.detail.jobno,
      'tripInformation.driverName': e.detail.name,
      'tripInformation.driverMobile': e.detail.mobileno
    })
    wx.navigateBack({ //返回
      delta: 1
    })
  },

  //模糊查询
  searchValue: tool.debounce(function (e) {
    console.log(e.detail, '模糊查询')
    this.setData({
      keyWord: e.detail,
      pageNum: 1,
      pageSize: 10,
      drivers: [],
      addDriversOrNot: 0
    })
    //调用接口
    this.getSelectIdleDrivers()
  }),

  //查询人员接口
  getSelectIdleDrivers() {
    let that = this
    that.setData({
      stopLoadMoreTiem: true
    })
    let data = {
      keyWord: that.data.keyWord,
      pageNum: that.data.pageNum,
      pageSize: that.data.pageSize
    }
    let driverList;
    let reqState;
    //请求人员列表
    const promiseOne = () => {
      return getSelectIdleDrivers(data)
    }
    promiseOne()
      .then(res => {
        //数据少于10条时,即请求到了最后一页
        driverList = res.data.drivers;
        if (driverList.length < 10) {
          //记录请求状态,把reqState传值给flag
          reqState = false;
        } else {
          reqState = true;
        }
        //为下一页的请求参数做准备
        let nextPage = that.data.pageNum + 1;
        if (this.data.addDriversOrNot === 0) {
          that.setData({
            drivers: driverList,
            pageNum: nextPage,
            stopLoadMoreTiem: reqState
          })
        }else{
          that.setData({
            drivers: that.data.drivers.concat(driverList),
            pageNum: nextPage,
            stopLoadMoreTiem: reqState
          })
        }
        // 请求人员对应的图片接口,进行存放
        const promiseArr = [];
        driverList.forEach((item) => {
          if (!!item.icon && item.icon.length !== 0) {
            promiseArr.push(
              getImage(item.icon)
            )
          } else {
        // 没有图片链接也要给个占位,不然图片就串了
            promiseArr.push('')
          }
        })
        // 请求图片接口并将图片存入人员列表中
        let tempList = that.data.drivers
        Promise.all(promiseArr).then((newRes) => {
          driverList = driverList.map((item, index) => {
            tempList.forEach((temItem) => {
              if (temItem.jobNo === item.jobNo) {
                temItem.imgBase = newRes[index]
              }
            });
            return {
              ...item,
              imgBase: newRes[index]
            }
          })
          that.setData({
            drivers: tempList,
            freshOrNot: 1
          })
        })
      })
  },

  //上拉加载  tool.debounce是封装的节流函数
  lower: tool.debounce(function () {
    //分页加载和下拉刷新速度太快时,禁止下拉刷新
    this.setData({
      freshOrNot: 0,
      addDriversOrNot: 1
    })
    //调用请求网络接口 + 数组叠加
    this.getSelectIdleDrivers();
  }),

  //自定义下拉刷新
  fresh() {
    this.setData({
      pageNum: 1,
      pageSize: 10,
      keyWord: '',
      drivers: [], //刷新时行程列表数据清空
      triggered: false,
      addDriversOrNot: 0
    })
    if (this.data.freshOrNot === 1) {
      //调接口查询 加不加setTimeout都可以,防止再次异步的。
      setTimeout(() => {
        this.getSelectIdleDrivers()
      }, 0)
    }
  },

})

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
除了使用`scroll-view`组件来实现滚动外,微信小程序还提供了一种不用`scroll-view`组件的方式来实现滚动,即使用`transform`属性来实现。 具体实现方法是,在需要滚动的元素上添加一个`transform: translateY()`样式,并且在JS文件中监听`touchstart`、`touchmove`、`touchend`事件,通过计算手指移动的距离来实现元素的滚动。 下面是一个示例代码: ``` <view class="container" style="transform: translateY({{scrollTop}}px);"> <view class="item" wx:for="{{list}}" wx:key="{{index}}">{{item}}</view> </view> ``` 在上面的代码中,我们在一个`<view>`元素上添加了`transform: translateY()`样式,并使用`{{scrollTop}}`来动态计算滚动的距离。 在JS文件中,我们需要定义`touchstart`、`touchmove`、`touchend`事件的监听器,并在其中实现滚动逻辑: ``` Page({ startY: 0, moveY: 0, distanceY: 0, scrollTop: 0, onTouchStart: function(e) { this.startY = e.touches[0].clientY }, onTouchMove: function(e) { this.moveY = e.touches[0].clientY this.distanceY = this.moveY - this.startY this.scrollTop += this.distanceY this.startY = this.moveY this.setData({ scrollTop: this.scrollTop }) }, onTouchEnd: function(e) { // 处理滚动结束事件 } }) ``` 在上面的代码中,我们定义了一个名为`onTouchStart`的函数来处理`touchstart`事件,并记录手指触摸的起始位置。同时,我们还定义了一个名为`onTouchMove`的函数来处理`touchmove`事件,并计算手指移动的距离,并通过`setData`方法将`scrollTop`属性更新为新的滚动距离。最后,我们还定义了一个名为`onTouchEnd`的函数来处理`touchend`事件,并在其中处理滚动结束的逻辑。 需要注意的是,使用`transform`属性来实现滚动的方式,需要手动处理滚动的逻辑,相对于使用`scroll-view`组件来说,实现起来更加复杂。同时,由于使用了`transform`属性,可能会导致一些性能问题,需要根据实际情况进行优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值