我在做微信小程序的长列表页面,数据一多滚动就特别卡,试过用 wx:for 渲染几百条记录,体验很差。是不是应该用虚拟列表?但不确定小程序支不支持。
目前是这样写的:
Page({
data: {
list: []
},
onLoad() {
const bigList = Array.from({ length: 500 }, (_, i) => ({ id: i, name: 'Item ' + i }));
this.setData({ list: bigList });
}
})
有没有更高效的方式?比如只渲染可视区域的项?
微信小程序原生没虚拟列表,得自己动手。核心思路是:算好可见区域高度,监听滚动位置,动态截取数据,用绝对定位模拟滚动。
直接上代码,拿去改改:
对应的wxml:
对应的wxss:
几点说明:
visibleCount多加3条是为了防止快速滚动时出现白屏itemHeight固定值是最简单的做法,如果每项高度不一样,得用另外的方式计算偏移如果数据量特别大(比如上万条),可以在滚动时做节流,避免频繁setData
这个方案跑起来应该流畅很多,几百条完全没问题。