Vue3實現(xiàn)高性能虛擬列表的兩種方法
正文
在前端開發(fā)中,大數(shù)據(jù)量列表渲染 一直是性能挑戰(zhàn)。假設我們有一個 API 返回 1 萬條數(shù)據(jù),如果直接渲染到頁面,必然會導致嚴重卡頓甚至瀏覽器崩潰。
解決方案就是 —— 虛擬列表 (Virtual List) 。
虛擬列表的核心思想是:只渲染當前視口范圍內(nèi)的元素,通過計算位置來“假裝”完整渲染。
常見實現(xiàn)方式主要有兩種:
- Spacer 占位法
- Absolute 定位法
本文將對比這兩種實現(xiàn),并給出適用場景。
1. Spacer 占位法實現(xiàn)
思路:用 上空白塊 + 下空白塊 撐出容器總高度,視口中只渲染真實元素。
<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>
優(yōu)點:
- 實現(xiàn)簡單直觀
- 支持動態(tài)高度(只要調(diào)整 spacer 值即可)
缺點:
- 多余的 DOM(兩個 spacer)
- 每次滾動都要更新
topSpacer和bottomSpacer,涉及 回流 (Reflow)
2. Absolute 定位法實現(xiàn)
思路:先撐出一個 固定高度的容器,每個 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>
優(yōu)點:
- DOM 結(jié)構(gòu)更簡潔(沒有 spacer)
- 絕對定位減少回流,性能更好
- 更適合大數(shù)據(jù)場景(5w+ 條時依然穩(wěn)定)
缺點:
- 對自適應高度支持不友好(必須固定高度)
position: sticky等布局特性會失效
3. 性能對比
| 對比維度 | Spacer 占位法 | Absolute 定位法 |
|---|---|---|
| DOM 結(jié)構(gòu) | 多 2 個占位元素 | 更簡潔 |
| 回流影響 | spacer 高度頻繁變化,可能觸發(fā)回流 | 元素絕對定位,回流更少 |
| 動態(tài)高度 | 支持,容易實現(xiàn) | 支持困難,需要累積高度映射 |
| 大數(shù)據(jù)量 (10w+) | 可能浮點誤差 | 更穩(wěn),F(xiàn)PS 更高 |
| 布局特性 | 流式布局更自然 | 絕對定位可能受限 |
4. 實踐建議
- 固定高度 item → 推薦 Absolute 定位法
簡潔高效,減少 DOM & 回流開銷。 - 動態(tài)高度 item → 推薦 Spacer 占位法
更容易適配復雜布局。 - 超大數(shù)據(jù)量 (5w+ 條) → Absolute 更穩(wěn)
如果你要做一個通用組件,可以支持 兩種實現(xiàn)方式切換:
- 默認使用 Absolute 定位法
- 如果檢測到 item 高度不一致,再切換到 Spacer 占位法
這種混合策略,正是一些成熟虛擬列表庫(如 react-window、vue-virtual-scroll-list)的做法。
5. 結(jié)論
- 兩種方案都能解決虛擬列表問題
- Absolute 定位法 在固定高度場景下性能更優(yōu)
- Spacer 占位法 更靈活,能支持動態(tài)高度
所以,選擇哪種方案要根據(jù) 業(yè)務需求 來定。
到此這篇關于Vue3實現(xiàn)高性能虛擬列表的兩種方法的文章就介紹到這了,更多相關Vue3高性能虛擬列表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Vue3+Vite中不支持require的方式引入本地圖片的解決方案
這篇文章主要介紹了Vue3+Vite中不支持require的方式引入本地圖片的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
誤引用vuex-persistedstate導致用戶信息無法清除問題及解決
這篇文章主要介紹了誤引用vuex-persistedstate導致用戶信息無法清除問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue?項目中選擇?TSX?而非傳統(tǒng)?.vue?文件的原因分析
文章探討了Vue項目中使用TSX(TypeScript?JSX)的背景、優(yōu)勢和局限性,TSX結(jié)合了TypeScript和JSX,增強了類型安全和代碼組織性,但也增加了學習曲線和可讀性問題,對于復雜應用,TSX提供了更大的靈活性和類型支持,逐漸成為一些開發(fā)者的選擇2024-11-11
vue.js 實現(xiàn)點擊按鈕動態(tài)添加li的方法
今天小編就為大家分享一篇vue.js 實現(xiàn)點擊按鈕動態(tài)添加li的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue+layui實現(xiàn)select動態(tài)加載后臺數(shù)據(jù)的例子
今天小編就為大家分享一篇vue+layui實現(xiàn)select動態(tài)加載后臺數(shù)據(jù)的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09
vue中Element-ui 輸入銀行賬號每四位加一個空格的實現(xiàn)代碼
我們在輸入銀行賬號會設置每四位添加一個空格,輸入金額,每三位添加一個空格。那么,在vue,element-ui 組件中,如何實現(xiàn)呢?下面小編給大家?guī)砹藇ue中Element-ui 輸入銀行賬號每四位加一個空格的實現(xiàn)代碼,感興趣的朋友一起看看吧2018-09-09
vue改變數(shù)據(jù)后數(shù)據(jù)變化頁面不刷新的解決方法
這篇文章主要給大家介紹了關于vue改變數(shù)據(jù)后數(shù)據(jù)變化頁面不刷新的解決方法,vue比較常見的坑就是數(shù)據(jù)(后臺返回)更新了,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-07-07

