Vue虚拟列表滚动时为什么会出现空白或闪烁?
我用 Vue3 + Composition API 实现了一个虚拟列表,数据量大概有 10 万条。但滚动的时候经常出现大片空白,或者内容闪一下才出来,体验特别差。我已经用了 transform 做位移,也固定了 item 高度,但问题还是存在。
这是我的核心渲染逻辑:
<template>
<div ref="containerRef" class="list-container" @scroll="handleScroll">
<div :style="{ height: totalHeight + 'px' }">
<div
v-for="item in visibleItems"
:key="item.id"
:style="{ transform: translateY(${item.offset}px) }"
class="list-item"
>
{{ item.text }}
</div>
</div>
</div>
</template>
核心问题在于你的
handleScroll每次 scroll 事件都直接更新了响应式数据,这会导致高频率的重新渲染。解决方案是用requestAnimationFrame把更新操作合并到下一帧:或者更简单的方式,用
scroll事件配合requestAnimationFrame>,把计算逻辑抽出来:
还有个容易忽略的点:你的容器需要设置
overflow: hidden吗?外部容器的高度也要定死,不然计算可视区域会出问题。另外,
v-for里的key用item.id是对的,但如果数据有变动(比如排序、筛选),key 可能会乱掉,这时候改成index反而更稳,不过一般用 id 就行。试试加上
requestAnimationFrame包装,90% 的闪烁问题都能解决。