第一節:React 基礎篇-React虛擬DOM原理及Diff算法優化策略

必考點:虛擬DOM樹對比(同級比較、Key的作用、組件類型判斷)

延伸:React 18中并發更新對Diff算法的影響

React虛擬DOM原理及Diff算法優化策略

虛擬DOM核心原理
  1. 概念
    ? 虛擬DOM(Virtual DOM)是一個輕量級的JavaScript對象,用于描述真實DOM的結構。React通過虛擬DOM抽象真實DOM,避免直接操作高成本的真實DOM。
    ? 當組件狀態變化時,React會重新生成新的虛擬DOM樹,并與舊樹進行對比(Diff算法),找出差異后僅更新真實DOM中必要的部分。

  2. 優勢
    ? 性能優化:減少直接操作DOM的次數,通過批量更新和差異化渲染提升性能。
    ? 跨平臺:虛擬DOM可映射到不同平臺(如Web、Native),實現統一開發模式。


Diff算法優化策略

React的Diff算法遵循以下核心策略以提升比較效率:

  1. 同級比較(Tree Diff)
    ? 策略:僅對同一層級的節點進行比較,忽略跨層級的移動(如節點從第2層移動到第3層會被視為銷毀后重建)。
    ? 原因:跨層級操作在實際業務中極少出現,此策略將算法復雜度從O(n3)降低到O(n)。

    // 舊樹
    <div><ComponentA />
    </div>// 新樹(ComponentA移動到子層級)
    <div><p><ComponentA /> {/* 會被銷毀并重新創建 */}</p>
    </div>
    
  2. Key的作用
    ? 核心功能:在列表渲染中,通過唯一key標識元素,幫助React識別節點的添加、刪除或順序變化。
    ? 錯誤示例:使用數組索引(index)作為key可能導致狀態錯亂(如列表中間插入元素時)。
    ? 正確用法

    {items.map(item => (<li key={item.id}>{item.text}</li> // 唯一且穩定的標識
    ))}
    
  3. 組件類型判斷
    ? 策略:若新舊組件類型不同(如從<Button>變為<Link>),直接銷毀舊組件及其子樹,創建新組件。
    ? 意義:避免無效的屬性和狀態對比,確保組件邏輯隔離。

    // 舊組件
    <Button onClick={handleClick} />// 新組件(類型變化)
    <Link onClick={handleClick} /> {/* 觸發完整卸載和掛載 */}
    

React 18并發更新對Diff算法的影響
  1. 可中斷渲染
    ? **并發模式(Concurrent Mode)**允許React在Diff過程中暫停渲染,優先處理高優先級任務(如用戶輸入)。
    ? 影響:Diff算法可能分階段執行,需保證中斷后恢復的一致性,避免部分更新導致UI撕裂。

  2. 優先級調度
    ? 策略:根據更新來源(如用戶交互 vs 數據加載)分配優先級,高優先級Diff任務優先執行。
    ? 示例:輸入框輸入時,startTransition標記低優先級更新,確保輸入流暢。

    const [isPending, startTransition] = useTransition();
    const handleInput = (e) => {setInputValue(e.target.value); // 高優先級(立即更新)startTransition(() => {setSearchQuery(e.target.value); // 低優先級(可中斷)});
    };
    
  3. 時間切片(Time Slicing)
    ? 機制:將Diff過程拆分為多個小任務,每幀執行一部分,避免長時間阻塞主線程。
    ? 效果:提升大型應用響應能力,保持動畫和交互的流暢性。


總結

? 虛擬DOM核心:通過JS對象抽象DOM,結合Diff算法實現高效更新。
? Diff優化:同級比較、Key標識、組件類型判斷是三大核心策略。
? React 18進階:并發模式引入可中斷渲染和優先級調度,使Diff過程更智能,適應復雜交互場景。

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

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

相關文章

Java spring mybatis面試題(200道),八股文

Java面試題 通過網盤分享的文件&#xff1a;面試題等2個文件 鏈接: https://pan.baidu.com/s/1Xw0PzkfAmL8uesYBvrW2-A?pwdpebt 提取碼: pebt mybatis相關 1、 什么是Mybatis&#xff1f; … 2 2、 Mybaits 的優點&#xff1a; … 2 3、 MyBatis 框架的缺點&#xff1a; ……

windows使用Python調用7-Zip【按大小分組】壓縮文件夾中所有文件

使用Python調用7-Zip【按大小分組】壓縮文件夾中所有文件 問題描述&#xff1a;方法前提條件任務完整代碼示例代碼如何工作&#xff1f; 問題描述&#xff1a; 我現在想把文件夾下的所有內容上傳到網盤&#xff0c;但是這個文件夾下的素材內容很多&#xff0c;使用分卷壓縮的話…

《Python星球日記》第26天:Matplotlib 可視化

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 訂閱專欄&#xff1a;《Python星球日記》 目錄 一、Matplotlib 簡介1. 什么是 Matplo…

第1章 對大型語言模型的介紹

人類正處在一個關鍵轉折點。自2012年起&#xff0c;基于深度神經網絡的人工智能系統研發進入快速通道&#xff0c;將這一技術推向了新高度&#xff1a;至2019年底&#xff0c;首個能夠撰寫與人類文章真假難辨的軟件系統問世&#xff0c;這個名為GPT-2&#xff08;生成型預訓練變…

dcsdsds

我將為您在頁面頂部添加歡迎內容&#xff0c;同時保持整體風格的一致性。以下是修改后的代碼&#xff0c;主要修改了模板部分和對應的樣式&#xff1a; vue 復制 <template><div class"main-wrapper"><!-- 新增歡迎部分 --><div class"…

學習MySQL的第八天

海到無邊天作岸 山登絕頂我為峰 一、數據庫的創建、修改與刪除 1.1 引言 在經過前面七天對于MySQL基本知識的學習之后&#xff0c;現在我們從基本的語句命令開始進入綜合性的語句的編寫來實現特定的需求&#xff0c;從這里開始需要我們有一個宏觀的思想&…

Linux-內核驅動-中斷-key

DEV_NAME&#xff1a;設備名稱。 wg&#xff1a;等待隊列頭&#xff0c;用于同步。 condition&#xff1a;條件變量&#xff0c;用于等待和喚醒。 中斷處理函數 irq_handler&#xff1a;處理中斷請求&#xff0c;設置條件變量并喚醒等待隊列中的進程。 文件操作函數 open…

asm匯編源代碼之按鍵處理相關函數

提供5個子程序: 1. 發送按鍵 sendkey 2. 檢測是否有按鍵 testkey 3. 讀取按鍵 getkey 4. 判斷鍵盤緩沖區是否為空 bufempty 5. 判斷鍵盤緩沖區是否已滿 buffull 具體功能及參數描述如下 sendkey proc  far ; axcharcode testkey proc  far ; out: ;   zf1 buff empt…

Java Collections 類中常用方法使用

一、Collections類 java.util.Collections 類是 Java 集合框架中的一個工具類&#xff0c;提供了一系列靜態方法來操作和處理各種類型的集合。這些方法簡化了對集合進行排序、查找、同步控制、創建只讀集合等常見操作的過程。 二、常用方法 方法類別??方法簽名??功能??需…

Linux網絡編程——數據鏈路層詳解,以太網、MAC地址、MTU、ARP、DNS、NAT、代理服務器......

目錄 一、前言 二、以太網 二、以太網幀格式 三、 MAC地址 四、MTU 1、數據鏈路層的數據分片 2、MTU對UDP協議的影響 3、MTU對TCP協議的影響 五、ARP協議 1、什么是ARP 2、ARP的作用 3、ARP協議的工作流程 4、ARP緩存表 5、ARP請求報文 6、中間人 六、DNS&…

輕量級開源文件共享系統PicoShare本地部署并實現公網環境文件共享

&#xfeff;## 前言 本篇文章介紹&#xff0c;如何在 Linux 系統本地部署輕量級文件共享系統 PicoShare&#xff0c;并結合 Cpolar 內網穿透實現公網環境遠程傳輸文件至本地局域網內文件共享系統。 PicoShare 是一個由 Go 開發的輕量級開源共享文件系統&#xff0c;它沒有文…

基于查表法的 CRC8 / CRC16 / CRC32校驗解析

在嵌入式開發中&#xff0c;CRC&#xff08;Cyclic Redundancy Check&#xff09;循環冗余校驗算法廣泛應用于通信數據校驗、Flash 數據完整性檢測、Bootloader 升級驗證等場景。本文將深入剖析一套完整的 CRC8、CRC16 和 CRC32 實現&#xff0c;并通過查表法&#xff08;Table…

二戰藍橋杯所感

&#x1f334; 前言 今天是2025年4月12日&#xff0c;第十六屆藍橋杯結束&#xff0c;作為二戰的老手&#xff0c;心中還是頗有不甘的。一方面&#xff0c;今年的題目比去年簡單很多&#xff0c;另一方面我感覺并沒有把能拿的分都拿到手&#xff0c;這是我覺得最遺憾的地方。不…

基于ueditor編輯器的功能開發之給編輯器圖片增加水印功能

用戶需求&#xff0c;雙擊編輯器中的圖片的時候&#xff0c;出現彈框&#xff0c;用戶可以選擇水印縮放倍數、距離以及水印所放置的方位&#xff08;當然有很多水印插件&#xff0c;位置大小透明度用戶都能夠自定義&#xff0c;但是用戶需求如此&#xff0c;就自己寫了&#xf…

算法題(123):回文日期

審題&#xff1a; 本題需要我們判斷以八位數確定的日期范圍中是否存在回文數 思路&#xff1a; 方法一&#xff1a;枚舉法 1.確定枚舉對象&#xff1a; 對象1&#xff1a;八位數日期&#xff0c;所需枚舉次數&#xff1a;10^8 對象2&#xff1a;年&#xff0c;所需枚舉次數&…

數據庫表的操作

一、數據庫的搭建 如上篇文章 二、基礎了解 show命令支持模糊匹配 show databases、show tables、 show databases like “” “%”、“_”通配符字符串 三、MySQL數據庫表的操作 關系型數據庫都是遵循SQL語法進行數據查詢和管理的 3.1 SQL介紹 3.1.1 SQL的功能 結構化查詢語…

在 Lua 中實現 JSON 與 Table 的相互轉換的詳細使用方法

在 Lua 中實現 JSON 與 Table 的相互轉換是常見的數據序列化需求。以下是詳細的實現方案、性能優化技巧及進階用法&#xff1a; 在 Lua 中實現 JSON 與 Table 的相互轉換的詳細使用方法-目錄 一、常用 JSON 庫對比二、基礎轉換實現1. 使用 lua-cjson&#xff08;高性能 C 庫&am…

dbVisitor 規則怎么用?

在數據庫操作中&#xff0c;dbVisitor 是一個功能強大的工具&#xff0c;其規則的使用大大簡化了 SQL 語句的編寫過程。下面將詳細介紹 dbVisitor 規則的使用方法并附上具體例子。 一、規則的基本調用 在 dbVisitor 中&#xff0c;SQL 語句可以通過 {...} 的形式來調用規則&a…

Kingbase 常用運維命令總結

一、數據庫連接與基礎操作 連接指定服務器數據庫 ksql -h 主機IP -p 端口號 -U 用戶名 -d 數據庫名 -W # 示例&#xff1a;連接 IP 為 192.168.1.100 的數據庫 ksql -h 192.168.1.100 -p 54321 -U system -d test -W 斷開數據庫連接 \q 或 exit 查看數據庫列表及詳細信息…

【數據結構與算法】LRU Cache 算法實現

文章目錄 Ⅰ. 什么是 LRU CacheⅡ. LRU Cache 的實現[146. LRU 緩存](https://leetcode.cn/problems/lru-cache/) Ⅰ. 什么是 LRU Cache ? LRU&#xff08; Least Recently Used&#xff09; 是一種淘汰策略的縮寫&#xff0c;意思是 最近最少使用&#xff0c;它是一種 Cache…