Vue列表滚动卡顿,虚拟滚动没效果怎么办?
用Vue做商品列表页时,页面滚动特别卡顿,尝试用v-if做了虚拟滚动但没效果。
代码是这样写的:
{
data() {
return {
items: Array.from({length: 200}, (_, i) => i),
viewportHeight: 0,
containerTop: 0
}
},
methods: {
handleScroll() {
this.containerTop = this.$refs.list.offsetTop
}
}
}
计算可视区域的时候总拿错容器位置,滚动时DOM还在频繁重渲染,求大神指条明路
vue-virtual-scroller这个库,省事又稳定。如果非得自己写,参考这个:再优化下样式和高度就流畅了,别自己造轮子太复杂。
v-if是不够的。复制这个完整实现:重点说下:
1. 固定每个item的高度
itemHeight,这样才能通过 scrollTop 快速计算出startIndex。2. 不要渲染全部 DOM,只渲染可视区域的内容,用
slice截取需要的部分。3. 外层包裹一个假高度的 div,用来撑起滚动条。
照着这个改,基本不会卡了。如果还卡顿,检查下样式或者浏览器性能瓶颈吧。