面試(進階) —虛擬列表在什么場景使用,如何實現?


面試(進階)虛擬列表在什么場景使用,如何實現?


在前端開發中,當需要渲染大量數據時,傳統的渲染方式往往會遇到性能瓶頸。一次性將大量數據渲染到DOM中,不僅會導致頁面加載緩慢,還可能占用大量內存,影響瀏覽器的響應速度。為了解決這個問題,虛擬列表(Virtual List)技術應運而生。


在這里插入圖片描述

虛擬列表的定義

虛擬列表是一種優化長列表渲染的技術。它的核心思想是:只渲染當前視口(viewport)內可見的數據項,而非一次性渲染所有數據。通過動態計算視口內應顯示的數據項,虛擬列表能夠顯著減少DOM節點的數量,從而提高頁面的渲染性能和交互流暢度。

虛擬列表的關鍵點

  1. 視口計算:確定當前視口的大小和位置,以及每個列表項的高度。
  2. 數據截取:根據視口的位置和大小,從數據源中截取應顯示的數據項。
  3. DOM渲染:僅將截取的數據項渲染到DOM中。
  4. 滾動監聽:監聽用戶的滾動操作,實時更新視口的位置,并重新渲染可見的數據項。

虛擬列表的實現原理

虛擬列表的實現通常涉及以下幾個步驟:

  1. 計算視口高度和列表項高度:這是為了確定在視口內能夠顯示多少個列表項。
  2. 確定起始和結束索引:根據滾動條的位置和列表項的高度,計算出當前視口內應顯示的起始和結束數據索引。
  3. 渲染數據:根據計算出的起始和結束索引,從數據源中截取相應部分的數據進行渲染。
  4. 更新視口:監聽滾動事件,當用戶滾動列表時,重新計算起始和結束索引,并更新渲染的內容。

Vue版本案例代碼

下面是一個使用Vue.js實現的虛擬列表示例:

<template><div id="app"><div class="container" ref="container" @scroll="handleScroll"><divclass="item"v-for="(item, index) in visibleItems":key="index":style="{ top: `${(startIndex + index) * itemHeight}px` }">{{ item }}</div></div></div>
</template><script>
export default {data() {return {items: [], // 數據源itemHeight: 30, // 每個列表項的高度containerHeight: 300, // 容器高度startIndex: 0, // 當前視口的起始索引endIndex: 0, // 當前視口的結束索引};},computed: {visibleItems() {// 計算當前視口內應顯示的數據項return this.items.slice(this.startIndex, this.endIndex);},},mounted() {// 初始化數據源this.items = Array.from({ length: 1000 }, (_, i) => `Item ${i + 1}`);this.updateVisibleItems();},methods: {updateVisibleItems() {// 更新視口內的起始和結束索引const container = this.$refs.container;const totalItems = this.items.length;const displayedItems = Math.ceil(this.containerHeight / this.itemHeight);this.startIndex = Math.max(0, Math.floor(container.scrollTop / this.itemHeight));this.endIndex = Math.min(totalItems, this.startIndex + displayedItems);},handleScroll() {// 監聽滾動事件,更新可見數據項this.updateVisibleItems();},},
};
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;text-align: center;color: #2c3e50;margin-top: 60px;
}.container {height: 300px;overflow-y: auto;border: 1px solid #ccc;position: relative;
}.item {height: 30px;border-bottom: 1px solid #eee;padding: 5px;box-sizing: border-box;position: absolute;width: 100%;
}
</style>

解析描述

模板部分

  • 使用<div>元素作為容器,并綁定了滾動事件監聽器。
  • 使用v-for指令循環渲染可見的數據項,并通過:style綁定動態設置每個列表項的頂部位置。

腳本部分

  • 定義了數據源items,每個列表項的高度itemHeight,容器高度containerHeight,以及當前視口的起始和結束索引startIndexendIndex
  • mounted生命周期鉤子中初始化數據源,并調用updateVisibleItems方法更新可見數據項。
  • 定義了updateVisibleItems方法,用于根據滾動條的位置更新視口內的起始和結束索引。
  • 定義了handleScroll方法,監聽滾動事件并調用updateVisibleItems方法更新可見數據項。

樣式部分

  • 為容器和列表項設置了樣式,包括高度、邊框、滾動條等。
  • 使用position: absolute;為列表項設置絕對定位,以便根據起始索引動態調整每個列表項的位置。

通過這個Vue版本的虛擬列表實現,我們可以更加直觀地理解虛擬列表的工作原理和實現方式。在實際應用中,還可以根據需要進行進一步優化和擴展,如支持動態調整列表項高度、處理大量數據時的性能優化等。



虛擬列表的優缺點

優點

  1. 性能提升:虛擬列表通過只渲染可視區域內的項,顯著減少了DOM元素的數量,從而提高了頁面的渲染效率和響應速度。這對于處理大量數據(如十萬、百萬級別)的列表尤其有效。
  2. 內存優化:由于只渲染可見區域內的元素,虛擬列表節省了內存消耗,避免了大規模數據的全部渲染,有助于提升應用的性能。
  3. 流暢體驗:用戶滾動列表時,虛擬列表可以實現流暢的加載和切換,減少了頁面卡頓現象,提升了用戶體驗。

缺點

  1. 實現復雜度:虛擬列表的實現相對復雜,需要開發者具備一定的前端技術基礎,包括DOM操作、事件監聽、計算邏輯等。
  2. 兼容性:在某些特殊情況下,虛擬列表可能與某些CSS樣式或布局方式存在兼容性問題,需要開發者進行額外的調試和優化。

比較

列表類型渲染方式優缺點適用場景
虛擬列表只渲染可視區域內的項優點:性能高、內存占用少、用戶體驗流暢;缺點:實現復雜、可能存在兼容性問題處理大量數據的列表,如聊天記錄、商品列表、評論區等
普通列表一次性渲染所有數據項優點:實現簡單;缺點:性能低、內存占用高、用戶體驗可能卡頓數據量較小的列表,如導航菜單、標簽頁等
分頁列表分批次加載數據并渲染優點:減少單次加載的數據量,提升性能;缺點:用戶需要手動翻頁,體驗可能不如虛擬列表流暢數據量較大的列表,且希望減少單次加載壓力的情況
無限滾動列表用戶滾動到底部時加載更多數據優點:用戶體驗較為流暢,無需手動翻頁;缺點:可能存在性能問題,尤其是在數據量非常大的情況下希望提供連續滾動體驗的場景,如新聞資訊、社交媒體等

分析

  • 普通列表適用于數據量較小的場景,實現簡單但性能較低。
  • 分頁列表通過分批次加載數據來減少單次加載的壓力,適用于數據量較大的情況,但用戶需要手動翻頁,體驗可能不如虛擬列表流暢。
  • 無限滾動列表提供了連續滾動的體驗,適用于希望用戶能夠連續瀏覽的場景,但在數據量非常大的情況下可能存在性能問題。
  • 虛擬列表則通過只渲染可視區域內的項來顯著提升性能和用戶體驗,特別適用于處理大量數據的列表場景。然而,其實現相對復雜,且可能存在兼容性問題。

在選擇列表類型時,開發者應根據具體的應用場景、數據量、性能要求以及用戶體驗需求進行綜合考慮。

看到這里的小伙伴,歡迎點贊、評論,收藏!

如有前端相關疑問,博主會在第一時間解答,也同樣歡迎添加博主好友,共同進步!!!

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896559.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896559.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896559.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux Mem -- 關于AArch64 MTE功能的疑問

目錄 1.虛擬地址和物理地址映射完成后&#xff0c;才可以設置虛擬地址對應的memory tag &#xff1f; 2.各種memory allocator中的address tag從哪來&#xff0c;怎么產生&#xff1f; 2.1 vmalloc allocator 2.2 slub分配器 2.3 用戶可以指定IRG指令產生的address tag 3.kasan…

python-leetcode-顏色分類

75. 顏色分類 - 力扣&#xff08;LeetCode&#xff09; class Solution:def sortColors(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""low, mid, high 0, 0, len(nums) - 1while mid < h…

ArcGIS Pro技巧實戰:高效矢量化天地圖地表覆蓋圖

在地理信息系統&#xff08;GIS&#xff09;領域&#xff0c;地表覆蓋圖的矢量化是一項至關重要的任務。天地圖作為中國國家級的地理信息服務平臺&#xff0c;提供了豐富且詳盡的地表覆蓋數據。然而&#xff0c;這些數據通常以柵格格式存在&#xff0c;不利于進行空間分析和數據…

【江科大STM32】TIM輸出比較(學習筆記)

本章圖片文字內容也為重要知識&#xff0c;請馬住&#xff01; 輸出比較簡介 OC&#xff08;Output Compare&#xff09;輸出比較輸出比較可以通過比較CNT與CCR寄存器值的關系&#xff0c;來對輸出電平進行置1、置0或翻轉的操作&#xff0c;用于輸出一定頻率和占空比的PWM波形…

【網絡安全 | 漏洞挖掘】利用文件上傳功能的 IDOR 和 XSS 劫持會話

未經許可,不得轉載。 本文涉及漏洞均已修復。 文章目錄 前言正文前言 想象這樣一個場景:一個專門處理敏感文檔的平臺,如保險理賠或身份驗證系統,卻因一個設計疏漏而成為攻擊者的“金礦”。在對某個保險門戶的文件上傳功能進行測試時,我意外發現了一個可導致大規模賬戶接管…

飛算 JavaAI 如何讓微服務開發快人一步?

在當今競爭激烈的軟件開發領域&#xff0c;微服務架構因其靈活性和可擴展性備受青睞。然而&#xff0c;微服務開發過程復雜&#xff0c;從需求分析到最終代碼實現&#xff0c;每個環節都需要耗費大量時間和精力。飛算 JavaAI 的出現&#xff0c;猶如一道曙光&#xff0c;為開發…

Python—Excel全字段轉json文件(極速版+GUI界面打包)

目錄 專欄導讀1、背景介紹2、庫的安裝3、核心代碼4、完整代碼(簡易版)5、進階版(GUI)總結專欄導讀 ?? 歡迎來到Python辦公自動化專欄—Python處理辦公問題,解放您的雙手 ?????? 博客主頁:請點擊——> 一晌小貪歡的博客主頁求關注 ?? 該系列文章專欄:請點擊——…

2025年光電科學與智能傳感國際學術會議(ICOIS 2025)

重要信息 官網&#xff1a;www.ic-icois.org 時間&#xff1a;2025年3月14-16日 地點&#xff1a;中國-長春 簡介 2025年光電科學與智能傳感國際學術會議&#xff08;ICOIS 2025&#xff09;將于2025年3月14-16日在中國-長春隆重召開。會議將圍繞“光學光電”、“智能傳感”…

企業微信里可以使用的企業內刊制作工具,FLBOOK

如何讓員工及時了解公司動態、行業資訊、學習專業知識&#xff0c;并有效沉淀企業文化&#xff1f;一份高質量的企業內刊是不可或缺的。現在讓我來教你該怎么制作企業內刊吧 1.登錄與上傳 訪問FLBOOK官網&#xff0c;注冊賬號后上傳排版好的文檔 2.選擇模板 FLBOOK提供了豐富的…

YOLOv5 + SE注意力機制:提升目標檢測性能的實踐

一、引言 目標檢測是計算機視覺領域的一個重要任務&#xff0c;廣泛應用于自動駕駛、安防監控、工業檢測等領域。YOLOv5作為YOLO系列的最新版本&#xff0c;以其高效性和準確性在實際應用中表現出色。然而&#xff0c;隨著應用場景的復雜化&#xff0c;傳統的卷積神經網絡在處…

跟我學C++中級篇——定時器的設計

一、定時器 談到定時器&#xff0c;理論上講是各種語言和各種設計都無法避開的一個技術點。對于定時器來說&#xff0c;表面上就是一種時間間隔的處理約定&#xff0c;但對程序來說&#xff0c;可能就是設計層面、接口層面和庫或框架以及系統應用的一個大集合。不同的系統&…

智能機器人加速進化:AI大模型與傳感器的雙重buff加成

Deepseek不僅可以在手機里為你解答現在的困惑、占卜未來的可能&#xff0c;也將成為你的貼心生活幫手&#xff01; 2月21日&#xff0c;追覓科技旗下Dreamehome APP正式接入DeepSeek-R1大模型&#xff0c;2月24日發布的追覓S50系列掃地機器人也成為市面上首批搭載DeepSeek-R1的…

PostgreSQL10 邏輯復制實戰:構建高可用數據同步架構!

PostgreSQL10 邏輯復制實戰&#xff1a;打造高可用數據同步架構&#xff01; 概述 PostgreSQL 10 引入了邏輯復制&#xff08;Logical Replication&#xff09;&#xff0c;為數據庫高可用和數據同步提供了更靈活的選擇。PostgreSQL 復制機制主要分為物理復制和邏輯復制兩種&…

LVS+Keepalived高可用群集配置案例

以下是一個 LVSKeepalived 高可用群集配置案例&#xff1a; 1、環境準備 LVS 主調度器&#xff08;lvs1&#xff09;&#xff1a;IP 地址為 192.168.8.101&#xff0c;心跳 IP 為 192.168.4.101LVS 備調度器&#xff08;lvs2&#xff09;&#xff1a;IP 地址為 192.168.8.102…

原生家庭獨立的藝術:找到自我與家庭的平衡點

原生家庭獨立的藝術&#xff1a;找到自我與家庭的平衡點 &#x1f331; 引言 &#x1f308; 小林剛剛和父母結束了一次激烈的電話對峙。父母堅持認為他應該回到家鄉工作&#xff0c;“這樣我們也能照顧你”&#xff0c;而他則努力解釋自己在大城市的職業規劃。掛掉電話后&…

Java進階——注解一文全懂

Java注解&#xff08;Annotation&#xff09;是一種強大的元數據機制&#xff0c;為代碼提供了附加信息&#xff0c;能簡化配置、增強代碼的可讀性和可維護性。本文將深入探討 Java 注解的相關知識。首先闡述了注解的基礎概念&#xff0c;包括其本質、作用以及核心分類&#xf…

DeepSeek 15天指導手冊——從入門到精通 PDF(附下載)

DeepSeek使用教程系列--DeepSeek 15天指導手冊——從入門到精通pdf下載&#xff1a; https://pan.baidu.com/s/1PrIo0Xo0h5s6Plcc_smS8w?pwd1234 提取碼: 1234 或 https://pan.quark.cn/s/2e8de75027d3 《DeepSeek 15天指導手冊——從入門到精通》以系統化學習路徑為核心&…

【智能音頻新風尚】智能音頻眼鏡+FPC,打造極致聽覺享受!【新立電子】

智能音頻眼鏡&#xff0c;作為一款將時尚元素與前沿科技精妙融合的智能設備&#xff0c;這種將音頻技術與眼鏡形態完美結合的可穿戴設備&#xff0c;不僅解放了用戶的雙手&#xff0c;更為人們提供了一種全新的音頻交互體驗。新立電子FPC在智能音頻眼鏡中的應用&#xff0c;為音…

常用的 pip 命令

pip 是 Python 的包管理工具&#xff0c;可用于安裝、卸載、更新和管理 Python 包。以下是一些常用的 pip 命令&#xff1a; 1. 安裝包 安裝最新版本的包 pip install package_namepackage_name 是你要安裝的 Python 包的名稱&#xff0c;例如 pip install requests 可以安裝…

學習threejs,使用ShaderMaterial自定義著色器材質

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;threejs gis工程師 文章目錄 一、&#x1f340;前言1.1 ??THREE.ShaderMaterial1.1.1…