业务场景:商品列表下拉加载商品渲染慢,且下拉加载商品数量较多时,对某个商品的操作,如加减数量,输入框修改数量,加入购物车等都不能及时反应
优化方案总结
1.setData的正确使用
- 避免频繁setData,尽量将多次setData合并
- 将需要展示在界面的数据放到data中,其余的直接放到page其他对象下
- 使用setData的特殊key局部刷新技巧
2.IntersectionObserver对象
- IntersectionObserver 对象,用于推断某些节点是否可以被用户看见、有多大比例可以被用户看见;
- 故长列表可用该对象实现虚拟列表,只有指定屏幕范围内的数据才渲染,其他区域都使用骨架屏占位;
- 还有也可用此对象实现吸顶效果,之前是在onPageScroll里判断滑动距离大于等于搜索框距离顶部的距离时,搜索框吸顶。缺点是需要知道搜索框距离顶部的距离,且界面UI改变后,需要重新设定距离值,比较麻烦,且在onPageScroll里一直setData也会影响渲染性能。
使用IntersectionObserver实现吸顶:
3. 组件的合理使用
自定义组件的更新只在组件内部进行,不受页面其他内容的影响;定时组件的更新并不会影响页面上其他元素的更新;各个组件也将具有各自独立的逻辑空间。每个组件都分别拥有自己的独立的数据、setData调用; 特别是定时器等类型组件
4. 避免用户事件不当使用
视图层将事件反馈给逻辑层的通信过程是异步的,会产生一定的延迟,延迟时间与传递的数据量正相关。
1.去掉不必要的事件绑定,就不会产生无用却耗时的通信
2.不要在结点的data属性里放过大的数据
5. 优化 wxml 代码,提升渲染性能
减少wxml结点数量可有效降低初始渲染和重渲染的时间开销
6.onPageScroll 的合理使用
每次事件监听都是视图到逻辑层的通信过程
- 避免在onPageScroll中执行复杂逻辑
- 避免在onPageScroll中频繁调用setData
7. 小程序原生组件 Input 会影响渲染性能
封装Input组件,只有在用户点击input框时,才显示input框,否则都显示普通的view标签