[總概]Vue2/3React Diff算法

根據搜索結果,大部分文檔都詳細描述了Vue的Diff算法原理、優化策略以及實現細節。例如,網頁1詳細介紹了Vue Diff算法的核心設計,包括雙端比較和key的作用;Vue3中的快速Diff算法

通常,解釋一個算法可以從其基本原理、核心策略、優化手段、源碼實現以及應用場景等方面展開。根據搜索結果中的內容,可以組織成以下幾個部分:基本原理、核心策略(如雙端比較、key的重要性)、Vue3的優化(如靜態標記、Block Tree)、源碼實現概覽,以及實際應用中的注意事項。

基本原理部分,需要解釋為什么需要Diff算法,虛擬DOM的作用,以及傳統樹比較的問題。特別是傳統樹比較的復雜度問題,Vue通過層級比較和key優化將復雜度降低到O(n)

核心策略方面雙端比較和key的使用是關鍵。雙端比較算法,以及通過key快速定位節點。需要詳細說明四個指針的移動策略和key如何提高復用效率

Vue3的優化部分,討論了靜態節點標記(Patch Flag)和Block Tree結構,這些優化減少了不必要的比較。提到了靶向更新和快速Diff的預處理步驟,這些內容需要整合到優化策略中。

源碼實現方面,如patchChildren函數中的頭部、尾部比較,中間處理邏輯等。需要概述這些步驟,但避免陷入過多代碼細節,保持解釋的易懂性。

實際應用場景,提到了列表渲染時使用key的重要性,動態組件優化等。需要強調開發中的最佳實踐,如合理使用key,避免索引作為key等。

Vue 中的 Diff 算法是其虛擬 DOM 機制的核心,用于高效更新真實 DOM。以下從原理、優化策略、實現邏輯及實際應用進行詳細解析:


一、基本原理

  1. 為什么需要 Diff 算法
    直接操作真實 DOM 性能成本高(頻繁觸發重排和重繪)且易出錯。虛擬 DOM 通過 JavaScript 對象模擬 DOM 結構,在內存中對比變化后,以最小代價更新真實 DOM
    重排與重繪

  2. 傳統樹比較的復雜度問題
    傳統樹的最優差異比對復雜度為 O(n3),而 Vue 通過以下假設將復雜度降至 O(n):
    ? 層級穩定性:僅比較同層節點,不跨層級。
    ? Key 的重要性:通過唯一標識復用節點。
    ? 動態節點是少數:模板編譯時標記靜態節點,僅處理動態部分


二、核心策略:雙端比較與 Key 優化

  1. 雙端比較(Four Pointer)
    Vue 在同層級使用四個指針(舊頭、舊尾、新頭、新尾)進行多輪比對,快速定位可復用節點:
    ? 首尾對比:優先處理頭部和尾部相同節點,移動指針縮小范圍。
    ? 中間節點處理:若首尾不同,通過哈希表查找可復用節點并移動。
    // 示例:舊節點 [a, b, c, d],新節點 [b, c, e, a]
    // 比對后:復用 b、c,刪除 d,移動 a,新增 e

①依次比較,當比較成功后退出當前比較
②渲染結果以newVnode為準
③每次比較成功后start點和end點向中間靠攏
④當新舊節點中有一個start點跑到end點右側時終止比較
⑤如果都匹配不到,則舊虛擬DOM key值去比對新虛擬DOM的key值,如果key相同則復用,并移動到新虛擬DOM的位置

在這里插入圖片描述

  1. Key 的作用
    Key 是唯一標識節點復用的關鍵:
    ? 帶 Key:通過哈希表直接匹配,避免順序遍歷(復雜度 O(1))。
    ? 無 Key:退化為順序比對(復雜度 O(n)),可能導致錯誤復用。
    // 示例:新舊列表的 Key 相同則直接復用,避免重新渲染
    

Vue 的 diff 算法通過 哈希表優化 key 的查找過程,在列表更新時能快速定位新舊節點對應關系,從而減少 DOM 操作。以下是具體實現邏輯和代碼示例:


一、Key 的作用與哈希表優化原理
  1. Key 的唯一性
    Key 是虛擬 DOM 節點的唯一標識,Vue 通過 key 判斷新舊節點是否可復用,避免錯誤地更新或移動節點。

  2. 哈希表的實現邏輯
    Vue 在處理列表時,會為舊子節點創建一個 key -> index 的哈希表映射。當遍歷新子節點時,直接通過 key 在哈希表中查找對應的舊節點索引,時間復雜度從 O(n) 優化到 O(1)


二、Vue 源碼中的哈希表實現(簡化版)

以下是 Vue2 的 patchChildren 函數核心邏輯,展示了哈希表的使用:

function patchChildren(oldCh, newCh) {let oldStartIdx = 0, oldEndIdx = oldCh.length - 1;let newStartIdx = 0, newEndIdx = newCh.length - 1;// 1. 頭尾指針比較(雙端比較)while (oldStartIdx <= oldEndIdx

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

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

相關文章

【MySQL_03】數據庫基本--核心概念

文章目錄 一、數據庫基礎1.1 數據庫基礎定義1.2 數據庫分類與典型產品1.3 數據庫模型1.4 數據庫層次結構1.5 數據庫核心機制1.6 數據表和視圖1.61 數據表&#xff08;Table&#xff09;1.62 視圖&#xff08;View&#xff09; 1.7 鍵類型1.8 MySQL數據類型1.9 數據庫范式化 二、…

FreeRTOS第16篇:FreeRTOS鏈表實現細節04_為什么FreeRTOS選擇“侵入式鏈表”

文/指尖動聽知識庫-星愿 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:深入FreeRTOS內核:從原理到實戰的嵌入式開發指南 1 傳統鏈表 vs. 侵入式鏈表 在嵌入式系統中,內存和性能的優化至關重要。FreeRTOS選擇侵入式鏈表而非傳統鏈表,其背后是內…

STM32讀寫片內FLASH 筆記

文章目錄 前言STM32F105的內部ROM分布STM32F10x的閃存擦寫解鎖FPECMain FLASH 的編寫 main Flash的擦除注意點 前言 在通過OTA的方式對設備進行升級&#xff0c;若在使用內部FLASH裝載固件程序的方式下&#xff0c;需要擦寫 內部FLASH 從而實現把新的固件程序寫入到 內部FLASH…

Python爬蟲實戰:爬取財金網實時財經信息

注意:以下內容僅供技術研究,請遵守目標網站的robots.txt規定,控制請求頻率避免對目標服務器造成過大壓力! 一、引言 在當今數字化時代,互聯網數據呈爆炸式增長,其中蘊含著巨大的商業價值、研究價值和社會價值。從金融市場動態分析到行業趨勢研究,從輿情監測到學術信息收…

3.3.2 用仿真圖實現點燈效果

文章目錄 文章介紹Keil生成.hex代碼Proteus仿真圖中導入.hex代碼文件開始仿真 文章介紹 點燈之前需要準備好仿真圖keil代碼 仿真圖參考前文&#xff1a;3.3.2 Proteus第一個仿真圖 keil安裝參考前文&#xff1a;3.1.2 Keil4安裝教程 keil新建第一個項目參考前文&#xff1a;3.1…

996引擎-問題處理:實現自定義道具變身卡

996引擎-問題處理:實現自定義道具變身卡 方案一、修改角色外觀(武器、衣服、特效) 實現變身先看效果創建個NPC測試效果方案二、利用 Buff 實現變身創建:變身Buff配buff表,實現人物變形測試NPC創建道具:變身卡配item表,添加道具:變身卡觸發函數參考資料方案一、修改角色外…

AI視頻領域的DeepSeek—阿里萬相2.1圖生視頻

讓我們一同深入探索萬相 2.1 &#xff0c;本文不僅介紹其文生圖和文生視頻的使用秘籍&#xff0c;還將手把手教你如何利用它實現圖生視頻。 如下為生成的視頻效果&#xff08;我錄制的GIF動圖&#xff09; 如下為輸入的圖片 目錄 1.阿里巴巴全面開源旗下視頻生成模型萬相2.1模…

驅動 AI 邊緣計算新時代!高性能 i.MX 95 應用平臺引領未來

智慧浪潮崛起&#xff1a;AI與邊緣計算的時代 正悄然深植于我們的日常生活之中&#xff0c;無論是火熱的 ChatGPT 與 DeepSeek 語言模型&#xff0c;亦或是 Meta 智能眼鏡&#xff0c;AI 技術已經無形地影響著我們的生活。這股變革浪潮并未停歇&#xff0c;而是進一步催生了更高…

如何快速判斷IP是否為代理

1.探究IP地址的地理分布 代理IP的所在位置&#xff0c;往往與用戶實際所在地不吻合。可以通過運用WHOIS查詢工具或在線IP地址定位服務&#xff0c;輸入所需查詢的IP&#xff0c;即可獲得其地理位置信息。 若該信息顯示的位置并非用戶所在城市或顯示為知名代理服務器節點&…

從CL1看生物計算機的創新突破與發展前景:技術、應用與挑戰的多維度剖析

一、引言 1.1 研究背景與意義 隨著科技的飛速發展&#xff0c;計算機技術已經成為推動現代社會進步的核心力量之一。從最初的電子管計算機到如今的大規模集成電路計算機&#xff0c;計算機的性能得到了極大的提升&#xff0c;應用領域也不斷拓展。然而&#xff0c;傳統計算機…

AI革命先鋒:DeepSeek與藍耘通義萬相2.1的無縫融合引領行業智能化變革

云邊有個稻草人-CSDN博客 目錄 引言 一、什么是DeepSeek&#xff1f; 1.1 DeepSeek平臺概述 1.2 DeepSeek的核心功能與技術 二、藍耘通義萬相2.1概述 2.1 藍耘科技簡介 2.2 藍耘通義萬相2.1的功能與優勢 1. 全鏈條智能化解決方案 2. 強大的數據處理能力 3. 高效的模型…

zabbix圖表中文顯示方框

問題&#xff1a; zabbix安裝完成后&#xff0c;查看圖形&#xff0c;下方中文顯示為方框 思路&#xff1a; 替換字體文件&#xff0c;或者修改配置文件指向中文可以正常顯示的字體文件 方案&#xff1a; 查找資料確認影響因素 通過資料查詢得知&#xff0c;使用的字體文…

【Linux-網絡】HTTP的清風與HTTPS的密語

&#x1f3ac; 個人主頁&#xff1a;誰在夜里看海. &#x1f4d6; 個人專欄&#xff1a;《C系列》《Linux系列》《算法系列》 ?? 道阻且長&#xff0c;行則將至 目錄 &#x1f4da; 引言 &#x1f4da; 一、HTTP &#x1f4d6; 1.概述 &#x1f4d6; 2.URL &#x1f5…

通過數據庫網格架構構建現代分布式數據系統

在當今微服務驅動的世界中&#xff0c;企業在跨分布式系統管理數據方面面臨著越來越多的挑戰。數據庫網格架構已成為應對這些挑戰的強大解決方案&#xff0c;它提供了一種與現代應用架構相匹配的分散式數據管理方法。本文將探討數據庫網格架構的工作原理&#xff0c;以及如何使…

RangeError: Radix must be an integer between 2 and 36

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

荊為好的專欄推薦

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點下班 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 專欄推薦特別篇1. 后端專欄推薦2. 云原生專欄…

Bean 的生命周期主要包括以下階段:

Bean 的生命周期主要包括以下階段&#xff1a; 定義 &#xff1a;在配置文件或注解中定義 Bean&#xff0c;包括其類、作用域等信息。 實例化 &#xff1a;Spring 容器根據定義創建 Bean 的實例。 屬性賦值 &#xff1a;容器為 Bean 設置配置的屬性值。 初始化 &#xff1a;…

計算機基礎:二進制基礎06,用八進制來計數

專欄導航 本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄&#xff0c;故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。 &#xff08;一&#xff09;WIn32 專欄導航 上一篇&#xff1a;計算機基礎&#xff1a;二進制基礎05&#xff0c;八進制簡介 回…

圖論-腐爛的橘子

994.腐爛的橘子 在給定的 m x n 網格 grid 中&#xff0c;每個單元格可以有以下三個值之一&#xff1a;值 0 代表空單元格&#xff1b; 值 1 代表新鮮橘子&#xff1b; 值 2 代表腐爛的橘子。 每分鐘&#xff0c;腐爛的橘子 周圍 4 個方向上相鄰 的新鮮橘子都會腐爛。返回 直到…

TypeError: Cannot create property ‘xxx‘ on string ‘xxx‘

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…