微信小程序列表数据量大操作卡顿优化方案

1,336 阅读2分钟

业务场景:商品列表下拉加载商品渲染慢,且下拉加载商品数量较多时,对某个商品的操作,如加减数量,输入框修改数量,加入购物车等都不能及时反应

优化方案总结

1.setData的正确使用

  • 避免频繁setData,尽量将多次setData合并
  • 将需要展示在界面的数据放到data中,其余的直接放到page其他对象下
  •  使用setData的特殊key局部刷新技巧

image.png

2.IntersectionObserver对象

  • IntersectionObserver 对象,用于推断某些节点是否可以被用户看见、有多大比例可以被用户看见;
  • 故长列表可用该对象实现虚拟列表,只有指定屏幕范围内的数据才渲染,其他区域都使用骨架屏占位;
  • 还有也可用此对象实现吸顶效果,之前是在onPageScroll里判断滑动距离大于等于搜索框距离顶部的距离时,搜索框吸顶。缺点是需要知道搜索框距离顶部的距离,且界面UI改变后,需要重新设定距离值,比较麻烦,且在onPageScroll里一直setData也会影响渲染性能。
    使用IntersectionObserver实现吸顶:

image.png

3. 组件的合理使用

自定义组件的更新只在组件内部进行,不受页面其他内容的影响;定时组件的更新并不会影响页面上其他元素的更新;各个组件也将具有各自独立的逻辑空间。每个组件都分别拥有自己的独立的数据、setData调用; 特别是定时器等类型组件

4. 避免用户事件不当使用

视图层将事件反馈给逻辑层的通信过程是异步的,会产生一定的延迟,延迟时间与传递的数据量正相关。
1.去掉不必要的事件绑定,就不会产生无用却耗时的通信
2.不要在结点的data属性里放过大的数据

image.png

5. 优化 wxml 代码,提升渲染性能

减少wxml结点数量可有效降低初始渲染和重渲染的时间开销

6.onPageScroll 的合理使用

每次事件监听都是视图到逻辑层的通信过程

  • 避免在onPageScroll中执行复杂逻辑
  • 避免在onPageScroll中频繁调用setData

7. 小程序原生组件 Input 会影响渲染性能

封装Input组件,只有在用户点击input框时,才显示input框,否则都显示普通的view标签