虽然微信小程序自带了 onPullDownRefresh 事件能够监听用户的下拉动做,并能够在回调函数中进行下拉刷新列表的操做。可是有时候由于页面布局的关系,咱们在页面上所展现的列表数据并非直接在整个页面中进行布局的,而是放置在 scroll-view 这么一个组件中。javascript
那么在这么个组件中,如何进行下拉刷新操做?css
在 scroll-view 组件中自带了 bindscrolltoupper 事件,该事件在滚动条滚动到顶部/左边时触发。可是这么个事件远远不能知足咱们的须要,由于咱们还须要监听用户滑动的距离,而且在用户松开手指的瞬间进行页面刷新。html
为此,咱们能够考虑使用 js 原生的 touchstart、touchend、touchmove事件。java
在 scroll-view 中定义这三个事件web
<scroll-view scroll-y style="height:100%" bindtouchstart='touchStart' bindtouchend='touchEnd' bindtouchmove='touchMove'> </scroll-view>
为了获取用户触摸的状态,咱们须要在 data 中定义两个数据,小程序
data: { freshStatus: 'more', // 当前刷新的状态 showRefresh: false // 是否显示下拉刷新组件 }
基于这两个数据值,咱们就能够写出下拉刷新的组件来,如下代码须要放置在 scroll-view 中微信小程序
<view wx:if="{{showRefresh}}" style='width:100%;position:relative;padding:60rpx 0;'> <view class="text-gray" style='position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);'> <view wx:if="{{freshStatus == 'fresh'}}" class="flex"> <view class="lzy-loading"></view> <view>刷新中...</view> </view> <view class="text" wx:elif="{{freshStatus == 'more'}}"> <!-- 使用到了 colorUI 下拉箭头图标 --> <text class="cuIcon-refresharrow"></text> 继续下拉刷新 </view> <view class="text" wx:else> 释放刷新 </view> </view> </view>
首先是 showRefresh,它是个布尔型的数据,当用户下拉必定距离才显示这么个组件。而后就是 freshStatus 状态值,当用户下拉动做没有到必定距离(取值 ‘more’), 就显示 “继续下拉刷新” ;当用户下拉到知足刷新条件的距离时,freshStatus 取值 ‘end’,组件显示 “释放刷新”;而当用户松开手指后,就显示 “刷新中”,而后在事件处理中调用获取最新数据的函数,当数据刷新完后,设置 showRefresh 为 false,隐藏该组件。api
如下是事件处理微信
// 触摸开始 touchStart(e) { this.setData({ startY: e.changedTouches[0].pageY, freshStatus: 'more' }) }, // 触摸移动 touchMove(e) { let endY = e.changedTouches[0].pageY; let startY = this.data.startY; let dis = endY - startY; // 判断是否下拉 if (dis <= 0) { return; } let offsetTop = e.currentTarget.offsetTop; if (dis > 20) { this.setData({ showRefresh: true }, () => { if (dis > 50) { this.setData({ freshStatus: 'end' }) } else { this.setData({ freshStatus: 'more' }) } }) } else { this.setData({ showRefresh: false }) } }, // 触摸结束 touchEnd(e) { if (this.data.freshStatus == 'end') { // 延迟 500 毫秒,显示 “刷新中”,防止请求速度过快不显示 setTimeout(()=>{ this.getList(); // 获取最新列表数据 }, 500); } else { this.setData({ showRefresh: false }) } },
还有相关 wxssxss
.lzy-loading{ margin-right: 20rpx; float: left; width: 40rpx; height: 40rpx; border-radius: 50%; border: 1px solid #f0f0f0; border-left: 1px solid #6190E8; animation: load 1s linear infinite; -webkit-animation: load 1s linear infinite; } @-webkit-keyframes load { from{-webkit-transform:rotate(0deg);} to{-webkit-transform:rotate(360deg);} } @keyframes load { from{transform:rotate(0deg);} to{transform:rotate(360deg);}