微信小程序组件recycle-view
recycle-view
小程序自定义组件
使用此组件需要依赖小程序基础库 2.2.2 版本,同时依赖开发者工具的 npm 构建。具体详情可查阅官方 npm 文档。
背景
电商小程序往往需要展示很多商品,当一个页面展示很多的商品信息的时候,会造成小程序页面的卡顿以及白屏。原因有如下几点:
- 商品列表数据很大,首次 setData 的时候耗时高
- 渲染出来的商品列表 DOM 结构多,每次 setData 都需要创建新的虚拟树、和旧树 diff 操作耗时都比较高
- 渲染出来的商品列表 DOM 结构多,占用的内存高,造成页面被系统回收的概率变大。
因此实现长列表组件来解决这些问题。
<实现思路
核心的思路就是只渲染显示在屏幕的数据,基本实现就是监听 scroll 事件,并且重新计算需要渲染的数据,不需要渲染的数据留一个空的 div 占位元素。
假设列表数据有100个 item,知道了滚动的位置,怎么知道哪些 item 必须显示在页面?因为 item 还没渲染出来,不能通过 getComputedStyle 等 DOM 操作得到每个 item 的位置,所以无法知道哪些 item 需要渲染。为了解决这个问题,需要每个 item 固定宽高。item 的宽高的定义见下面的 API 的createRecycleContext()
的参数 itemSize 的介绍。</p><p> 滚动过程中,重新渲染数据的同时,需要设置当前数据的前后的 div 占位元素高度,同时是指在同一个渲染周期内。页面渲染是通过 setData 触发的,列表数据和 div 占位高度在2个组件内进行 setData 的,为了把这2个 setData 放在同一个渲染周期,用了一个 hack 方法,所以定义 recycle-view 的 batch 属性固定为<code>batch="{{batchSetRecycleData}}"。
在滚动过程中,为了避免频繁出现白屏,会多渲染当前屏幕的前后2个屏幕的内容。
包结构
长列表组件由2个自定义组件 recycle-view、recycle-item 和一组 API 组成,对应的代码结构如下
├── miniprogram-recycle-view/ └── recycle-view 组件 └── recycle-item 组件 └── index.js包结构详细描述如下:
目录/文件 | 描述 |
---|---|
recycle-view 组件 | 长列表组件 |
recycle-item 组件 | 长列表每一项 item 组件 |
index.js | 提供操作长列表数据的API |
使用方法
- 安装组件
- 在页面的 json 配置文件中添加 recycle-view 和 recycle-item 自定义组件的配置
- WXML 文件中引用 recycle-view
- 页面 JS 管理 recycle-view 的数据
- transformRpx会进行四舍五入,所以
transformRpx(20) + transformRpx(90)
不一定等于<code>transformRpx(110) - 如果一个页面有多个长列表,必须多设置batch-key属性,每个的batch-key的值和batch属性的变量必须不一致。例如:
<recycle-view batch="{{batchSetRecycleData1}}" batch-key="batchSetRecycleData1"></recycle-view> <recycle-view batch="{{batchSetRecycleData1}}" batch-key="batchSetRecycleData1"></recycle-view>