在Tarojs的VirtualList组件中支持下拉刷新功能

前情提要

最近在使用Tarojs做开发,主要用于微信小程序和h5,遇到了很多兼容性问题。比如本文要说的虚拟列表组件。项目中使用的tarojs版本是3.6.14,官网文档中说虚拟列表有onScrollToUpper事件,实际使用却没有,查看源码后也没有看到相关代码,不知道是哪里有问题,有知道的小伙伴可以说下~

先看效果

实现方案

其实实现下拉刷新功能本身是比较容易的,基本上就是在touchstart,touchmove,touchend上做处理,关键还是在兼容性和其他各种异常的处理上。

判定下拉刷新操作

通常情况下,只需要判断滚动条位置为0的时候,就可以认为已经在顶部了,对于touch就可以进入下拉刷新的代码了。但是virtualList中却不能根据这个来判断,在virtualList中通过监听scroll事件获取到的滚动条偏移量scrollOffset,他只是个参考值,甚至可能是负的。

解决方案,通过dom查找的方式获取到列表的第一个元素,因为virtualList默认是用绝对定位来实现的,所以只需要找到style.top的值是0的就是第一个元素。通过在初始化的时候记录下该元素的位置信息(使用boundingClientRect函数获取),将其top值记录下来。当页面上存在第一个元素,并且他的当前位置和初始位置相同,就可以认为他是回到了初始位置,也就是回到了顶部。

特殊的,在微信小程序端通过Taro.createSelectorQuery()的方式查找到节点,此操作是异步的。如果是在快速滚动操作时,可能最终查找的节点位置信息是滚动操作后的(不准确的),所以又必须保证异步计算的结果是当时的快照,所以用了订阅-发布的形式。如果判断touchstart时的位置是顶部的,就追加一个下拉的动画效果(动画就是在touchmove中将移动的偏移量赋值到刷新面板的高度上)。

相关推荐
百撕可乐6 分钟前
NextJS官网实战01:Vue与React的区别
前端·react.js·前端框架
Можно9 分钟前
Vue 组件样式隔离完全指南:从原理到实战
前端·javascript·vue.js
bearpping15 分钟前
WebSpoon9.0(KETTLE的WEB版本)编译 + tomcatdocker部署 + 远程调试教程
前端
elseif12325 分钟前
【Markdown】指南(上)
linux·开发语言·前端·javascript·c++·笔记
钛态36 分钟前
Flutter for OpenHarmony:shelf_web_socket 快速构建 WebSocket 服务端,实现端到端实时通信(WebSocket 服务器) 深度解析与鸿蒙适配指南
服务器·前端·websocket·flutter·华为·性能优化·harmonyos
紫_龙38 分钟前
最新版vue3+TypeScript开发入门到实战教程之组件通信之二
前端·javascript·typescript
英俊潇洒美少年44 分钟前
Vue3 响应式 + 编译优化 + Diff 三者如何配合工作
前端
英俊潇洒美少年44 分钟前
Vue3 完整渲染流程(从 createApp → mount → update → unmount)
前端·javascript·vue.js
前端Hardy1 小时前
Pinia 比 Vuex 好用 10 倍?Vue3 状态管理终于不折磨人了!(新手复制即用)
前端·javascript·vue.js
前端Hardy1 小时前
Vue3 的 v-model 双向绑定,90% 的人都用错了?(附 2026 最新避坑指南)
前端·javascript·vue.js