Vue 3 中列表虚拟化怎么实现不定高列表的高效渲染

秋浩同学_4239

秋浩同学_4239

2026-10-21

914人浏览

原创

vue 3 不定高虚拟列表通过 resizeobserver 动态测量+weakmap 缓存高度+累积逼近法计算可视范围,配合占位元素实时更新滚动条,实现流畅渲染。

vue 3 中列表虚拟化怎么实现不定高列表的高效渲染

Vue 3 中实现不定高列表的虚拟化渲染,核心在于绕过“高度未知”带来的计算死锁,不依赖预设值硬算位置,而是用动态测量 + 缓存 + 响应式更新三者协同。固定高方案靠 scrollTop / itemHeight 直接算索引,而不定高必须先知道每项真实高度,才能定位可视区域——这正是难点所在。

用 ResizeObserver 主动监听真实高度

不要等滚动时再测量,而是在每个列表项挂载后,立即用 ResizeObserver 监听其内容尺寸变化。它比 getBoundingClientRect 更轻量、不触发重排,且能响应图片加载、字体渲染完成等异步布局变化。

  • 每个 <listitem></listitem> 组件内部创建 ResizeObserver 实例,观测第一层内容容器(如 <div class="content">) <li>高度测得后,通过事件或上下文(如 <code>provide/inject)通知父级虚拟列表更新缓存
  • 首次进入视口前就完成测量,后续滚动可直接查缓存,避免重复 DOM 操作
  • 用 WeakMap 缓存已知高度,避免重复开销

    高度不是全局状态,而是与具体数据项绑定。用 WeakMap 存储 item → height 映射,既支持对象引用作为 key(适配复杂 item 结构),又不阻止垃圾回收。

    vue-composition-api-best-practices
    vue-composition-api-best-practices

    Vue 3 组合式 API 与

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Vue 教程
    Vue 教程

    共42课时 | 17.2万人学习

    国外Web开发全栈课程全集
    国外Web开发全栈课程全集

    共12课时 | 1.4万人学习

    Vue.js 微实战--十天技能课堂
    Vue.js 微实战--十天技能课堂

    共18课时 | 1.7万人学习