前几天分享了一个本身作的关于小程序组件扩展的开源项目(传送门)javascript
原本就是想给本身发布的第一个开源代码骗骗star,结果有很多善良的朋友给文章点赞了,搞得我有点很差意思,因此决定写点干货讲讲具体是怎么实现的。css
其实也比较简单,首先自定义组件下的 scroll-view
高度设为比组件自己高出 40px
,即头部显示刷新文字的区域高度,而后让 scroll-view
y轴偏移 -40px
,这样刷新文字区域就在顶部看不到了,具体css以下:java
.scroll-view {
height: calc(100% + 40px);
transform: translateY(-40px);
}
复制代码
而后就是监听 scroll-view
的 onscroll
事件,这里我将下拉刷新的状态分为五种:git
//这段偷懒没写在代码里,直接用的数字
const _pullDownStatusDic = {
invisiable: 0, //看不见
pulling: 1, //下拉时
release: 2, //可松开刷新时
refresing: 3, //正在刷新
finish: 4, //刷新完成
}
复制代码
那么在事件监听中根据当前的 scrollTop
来判断应该在哪种状态:github
//height就是预设的下拉至多少高度时刷新
if (scrollTop < -1 * height) {
targetStatus = 2;
} else if (scrollTop < 0) {
targetStatus = 1;
} else {
targetStatus = 0;
}
复制代码
问题来了,何时刷新呢?小程序的 scroll-view
并无 onscrollend
这种事件,因而我想到了 ontouchend
,毕竟在手机上也只能用触摸来滑动(点击头部返回顶部除外),因此只须要在 ontouchend
事件中监听若是当前的下拉状态是2(_pullDownStatusDic.release
)即松开可刷新时,就触发刷新:小程序
if (status === 2) {
this.setData({
pullDownStatus: 3,
})
this.properties.refreshing = true,
this.triggerEvent('pulldownrefresh');
}
复制代码
固然这个时候还有个问题,咱们须要把刷新文字局域显示出来,咱们是没办法吧一个 scroll-view
的 scrollTop
设为负数的,因此只能将 scroll-view
的y轴偏移取消来解决(产生的问题就是松手时会有一下弹动,后期会想办法进行优化)app
完成刷新后,再将 scroll-view
的y轴偏移经过css动画再变回 -40px
(用 translate
而不用 margin
就是为了此处动画的流畅度),这样就完成了一次下拉刷新。post
是否是很简单:)优化
另外还有一些小细节,还有加载更多,还有 xing-image
的一些实现,就更简单了,有兴趣的能够看看源码动画
最后再骗一波star:View on Github