Vue3实现高性能虚拟列表的两种方法

 更新时间:2025年08月31日 11:50:50   作者:excel  
在前端开发中,大数据量列表渲染 一直是性能挑战,假设我们有一个 API 返回 1 万条数据,如果直接渲染到页面,必然会导致严重卡顿甚至浏览器崩溃,解决方案就是虚拟列表,所以本文给大家介绍了本文两种实现,并给出适用场景,需要的朋友可以参考下

正文

在前端开发中,大数据量列表渲染 一直是性能挑战。假设我们有一个 API 返回 1 万条数据,如果直接渲染到页面,必然会导致严重卡顿甚至浏览器崩溃。

解决方案就是 —— 虚拟列表 (Virtual List)

虚拟列表的核心思想是:只渲染当前视口范围内的元素,通过计算位置来“假装”完整渲染。

常见实现方式主要有两种:

  1. Spacer 占位法
  2. Absolute 定位法

本文将对比这两种实现,并给出适用场景。

1. Spacer 占位法实现

思路:用 上空白块 + 下空白块 撑出容器总高度,视口中只渲染真实元素。

<div ref="root" @scroll="onScroll"
     :style="{ overflowY: 'auto', height: containerHeight + 'px' }">
  <!-- 上占位 -->
  <div :style="{ height: topSpacer + 'px' }"></div>

  <!-- 可见元素 -->
  <div v-for="item in visibleItems" :key="item.id" class="virtual-item">
    {{ item.text }}
  </div>

  <!-- 下占位 -->
  <div :style="{ height: bottomSpacer + 'px' }"></div>
</div>

优点:

  • 实现简单直观
  • 支持动态高度(只要调整 spacer 值即可)

 缺点:

  • 多余的 DOM(两个 spacer)
  • 每次滚动都要更新 topSpacerbottomSpacer,涉及 回流 (Reflow)

2. Absolute 定位法实现

思路:先撑出一个 固定高度的容器,每个 item 通过 absolute + top 定位。

<div ref="root" @scroll="onScroll"
     :style="{ overflowY: 'auto', height: containerHeight + 'px', position: 'relative' }">
  
  <!-- 总高度容器 -->
  <div :style="{ height: totalHeight + 'px', position: 'relative' }">
    <div v-for="(item, idx) in visibleItems"
         :key="item.id"
         class="virtual-item"
         :style="{ position: 'absolute', top: (startIndex + idx) * itemHeight + 'px' }">
      {{ item.text }}
    </div>
  </div>
</div>

优点:

  • DOM 结构更简洁(没有 spacer)
  • 绝对定位减少回流,性能更好
  • 更适合大数据场景(5w+ 条时依然稳定)

缺点:

  • 对自适应高度支持不友好(必须固定高度)
  • position: sticky 等布局特性会失效

3. 性能对比

对比维度Spacer 占位法Absolute 定位法
DOM 结构多 2 个占位元素更简洁
回流影响spacer 高度频繁变化,可能触发回流元素绝对定位,回流更少
动态高度支持,容易实现支持困难,需要累积高度映射
大数据量 (10w+)可能浮点误差更稳,FPS 更高
布局特性流式布局更自然绝对定位可能受限

4. 实践建议

  • 固定高度 item → 推荐 Absolute 定位法
    简洁高效,减少 DOM & 回流开销。
  • 动态高度 item → 推荐 Spacer 占位法
    更容易适配复杂布局。
  • 超大数据量 (5w+ 条) → Absolute 更稳

如果你要做一个通用组件,可以支持 两种实现方式切换

  • 默认使用 Absolute 定位法
  • 如果检测到 item 高度不一致,再切换到 Spacer 占位法

这种混合策略,正是一些成熟虚拟列表库(如 react-windowvue-virtual-scroll-list)的做法。

5. 结论

  • 两种方案都能解决虚拟列表问题
  • Absolute 定位法 在固定高度场景下性能更优
  • Spacer 占位法 更灵活,能支持动态高度

所以,选择哪种方案要根据 业务需求 来定。

到此这篇关于Vue3实现高性能虚拟列表的两种方法的文章就介绍到这了,更多相关Vue3高性能虚拟列表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue.js中的下载和调用方式

    Vue.js中的下载和调用方式

    这篇文章主要介绍了Vue.js中的下载和调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 实例教学如何写vue插件

    实例教学如何写vue插件

    本次小编通过一个简单的实例来教给大家如何写一个vue插件,以及需要注意的地方,如果有需要的读者跟着学习一下吧。
    2017-11-11
  • vue获取token实现token登录的示例代码

    vue获取token实现token登录的示例代码

    最近新做了个vue项目,正好项目中有登录部分,本文就详细的介绍一下登录部分的实现,文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • vue+element UI 文字加下划线长度多出一点点的问题

    vue+element UI 文字加下划线长度多出一点点的问题

    这篇文章主要介绍了vue+element UI 文字加下划线长度多出一点点的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • element table数据量太大导致网页卡死崩溃的解决办法

    element table数据量太大导致网页卡死崩溃的解决办法

    当页面数据过多,前端渲染大量的DOM时,会造成页面卡死问题,下面这篇文章主要给大家介绍了关于element table数据量太大导致网页卡死崩溃的解决办法,需要的朋友可以参考下
    2023-02-02
  • vue中destroyed方法的使用说明

    vue中destroyed方法的使用说明

    这篇文章主要介绍了vue中destroyed方法的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue cli安装使用less的教程详解

    vue cli安装使用less的教程详解

    这篇文章主要介绍了vue-cli安装使用less的教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-07-07
  • vue打包时不删除dist里的原有文件配置方法

    vue打包时不删除dist里的原有文件配置方法

    这篇文章主要为大家介绍了vue打包时不删除dist里的原有文件配置方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • vue+element实现动态换肤的示例代码

    vue+element实现动态换肤的示例代码

    本文主要介绍了vue+element实现动态换肤的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Vue 组件注册实例详解

    Vue 组件注册实例详解

    这篇文章主要介绍了Vue 组件注册,结合实例形式较为详细的分析了vue.js组件的常见分类、注册方法及相关操作注意事项,需要的朋友可以参考下
    2019-02-02

最新评论