vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue3高性能虚拟列表

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

作者: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>

优点:

 缺点:

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>

优点:

缺点:

3. 性能对比

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

4. 实践建议

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

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

5. 结论

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

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

您可能感兴趣的文章:
阅读全文