大白話詳細解讀React框架的diffing算法

1.?Diffing 算法是什么?

Diffing 算法是 React 用來比較虛擬 DOM(Virtual DOM)樹的一種算法。它的作用是找出前后兩次渲染之間的差異(diff),然后只更新這些差異部分,而不是重新渲染整個頁面。

簡單來說,React 通過 Diffing 算法來“找不同”,然后只更新需要變化的地方,從而提高性能。

2.?為什么需要 Diffing 算法?

在 Web 開發中,直接操作真實 DOM 是非常耗性能的,因為每次 DOM 更新都會觸發瀏覽器的重繪和重排。React 通過虛擬 DOM 和 Diffing 算法來減少對真實 DOM 的操作,從而提高性能。

  • 虛擬 DOM:是真實 DOM 的輕量級副本,用 JavaScript 對象表示。

  • Diffing 算法:比較新舊虛擬 DOM 樹的差異,找出需要更新的部分。

3.?Diffing 算法的工作原理

React 的 Diffing 算法基于兩個假設:

  1. 不同類型的元素會生成不同的樹:如果元素類型不同(比如從?<div>?變成?<span>),React 會直接銷毀舊樹,創建新樹。

  2. 通過 key 屬性來標識子元素:React 使用?key?來識別哪些子元素是相同的,從而減少不必要的更新。

具體來說,Diffing 算法的工作流程如下:

3.1?比較根元素
  • 如果根元素的類型不同,React 會直接銷毀舊樹,創建新樹。

<!-- 舊樹 -->
<div><h1>Hello</h1>
</div><!-- 新樹 -->
<span><h1>Hello</h1>
</span>
  • 這里?<div>?變成了?<span>,React 會直接銷毀舊樹,創建新樹。

  • 如果根元素的類型相同,React 會保留 DOM 節點,只更新變化的屬性。

<!-- 舊樹 -->
<div className="old">Hello</div><!-- 新樹 -->
<div className="new">Hello</div>
  • 這里?<div>?的類型相同,React 只會更新?className?屬性。

3.2?比較子元素
  • 如果子元素沒有?key,React 會按順序比較子元素。如果順序變化,可能會導致不必要的更新。

<!-- 舊樹 -->
<ul><li>Apple</li><li>Banana</li>
</ul><!-- 新樹 -->
<ul><li>Banana</li><li>Apple</li>
</ul>
  • 這里 React 會認為第一個?<li>?從?Apple?變成了?Banana,第二個?<li>?從?Banana?變成了?Apple,導致兩個?<li>?都被更新。

  • 如果子元素有?key,React 會通過?key?來識別哪些子元素是相同的,從而減少不必要的更新。

<!-- 舊樹 -->
<ul><li key="1">Apple</li><li key="2">Banana</li>
</ul><!-- 新樹 -->
<ul><li key="2">Banana</li><li key="1">Apple</li>
</ul>

這里 React 通過?key?知道?Apple?和?Banana?只是交換了位置,不會重新創建它們。

4.?Diffing 算法的優化策略

React 的 Diffing 算法有一些優化策略,來進一步提高性能:

  1. 同級比較:React 只會比較同一層級的節點,不會跨層級比較。這樣可以減少比較的復雜度。

  2. key 的作用:通過?key?來標識子元素,React 可以更高效地識別哪些元素是相同的,從而減少不必要的更新。

  3. 批量更新:React 會將多個狀態更新合并成一次更新,減少對真實 DOM 的操作。

5.?Diffing 算法的代碼示例

以下是一個簡單的例子,展示 React 如何通過 Diffing 算法更新 DOM:

function App() {const [items, setItems] = React.useState(['Apple', 'Banana']);const reverseItems = () => {setItems([...items].reverse());};return (<div><ul>{items.map((item, index) => (<li key={index}>{item}</li>))}</ul><button onClick={reverseItems}>Reverse</button></div>);
}
  • 當點擊?Reverse?按鈕時,items?數組的順序會被反轉。

  • 由于每個?<li>?都有?key,React 知道哪些元素是相同的,只會更新它們的位置,而不會重新創建它們。

6.?總結

  • Diffing 算法是 React 用來比較虛擬 DOM 樹的算法,目的是找出差異并只更新需要變化的部分。

  • 根元素比較:如果根元素類型不同,React 會直接銷毀舊樹,創建新樹。

  • 子元素比較:通過?key?來標識子元素,React 可以更高效地識別哪些元素是相同的。

  • 優化策略:React 通過同級比較、key 和批量更新等策略來提高性能。

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

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

相關文章

【Linux內核系列】:動靜態庫詳解

&#x1f525; 本文專欄&#xff1a;Linux &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 有些鳥兒是注定是關不住的&#xff0c;因為它們的每一片羽翼都沾滿了自由的光輝 ★★★ 本文前置知識&#xff1a; 編譯與鏈接的過程…

深度解讀DeepSeek部署使用安全(48頁PPT)(文末有下載方式)

深度解讀DeepSeek&#xff1a;部署、使用與安全 詳細資料請看本解讀文章的最后內容。 引言 DeepSeek作為一款先進的人工智能模型&#xff0c;其部署、使用與安全性是用戶最為關注的三大核心問題。本文將從本地化部署、使用方法與技巧、以及安全性三個方面&#xff0c;對Deep…

【詳細解決】pycharm 終端出現報錯:“Failed : 無法將“Failed”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。

昨天在終端一頓操作后突然打開pycharm時就開始報錯&#xff1a; 無法將“Failed”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱。請檢查名稱的拼寫&#xff0c;如果包括路徑&#xff0c;請確保路徑正確&#xff0c;然后再試一次。 所在位置 行:1 字符: 1 Failed to act…

【電路筆記】-D型觸發器

D型觸發器 文章目錄 D型觸發器1、概述2、主從D觸發器3、使用D型觸發器進行分頻4、D觸發器作為數據鎖存器5、透明數據鎖存器6、總結D型觸發器是一種改進的置位-復位觸發器,通過增加一個反相器來防止S和R輸入處于相同的邏輯電平。 1、概述 D型觸發器克服了基本SR NAND門雙穩態電…

智慧共享桿:城市智能化管理的 “多面手”

智慧共享桿&#xff1a;城市智能化管理的 “多面手” 在智慧城市建設的進程中&#xff0c;智慧共享桿憑借其多功能與集約化的特性&#xff0c;逐漸成為城市基礎設施建設領域的重點關注對象。它不僅革新了傳統路燈桿的固有模式&#xff0c;更為城市的高效管理與便捷服務開創了全…

【Tips】pip臨時換源

pip換源網站 用法&#xff1a; pip install xxx庫 -i https://pypi.tuna.tsinghua.edu.cn/simple https://pypi.tuna.tsinghua.edu.cn/simplehttps://mirrors.aliyun.com/pypi/simplehttps://pypi.douban.com/simplehttps://pypi.mirrors.ustc.edu.cn/simplehttps://mirrors.…

AcWing 838:堆排序 ← 數組模擬

【題目來源】 https://www.acwing.com/problem/content/840/ 【題目描述】 輸入一個長度為 n 的整數數列&#xff0c;從小到大輸出前 m 小的數。 【輸入格式】 第一行包含整數 n 和 m。 第二行包含 n 個整數&#xff0c;表示整數數列。 【輸出格式】 共一行&#xff0c;包含…

Microchip AN1477中關于LLC數字補償器的疑問

最近在學習Microchip的AN1477關于LLC的功率級傳遞函數推導及數字補償器設計&#xff0c;對其中的2P2Z數字補償器的系數有一些困惑。我在MATLAB中運行了源程序提供的VMC_LLC.m文件&#xff0c;發現有些地方和AN1477中的結果不一致。現在把相關有疑問的地方列舉出來&#xff0c;也…

【原創】使用ElasticSearch存儲向量實現大模型RAG

一、概述 檢索增強生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;已成為大型語言模型&#xff08;LLM&#xff09;應用的重要架構&#xff0c;通過結合外部知識庫來增強模型的回答能力&#xff0c;特別是在處理專業領域知識、最新信息或企業私有數…

分享下web3j 常見用法

轉賬 fun sendEthTransaction(privateKey: String,toAddress: String,amount: BigDecimal) {//chainIdval chainId:Long 1//url 可以從https://chainlist.org/里面獲取可用節點//eth轉賬&#xff0c;bnb同理&#xff0c;但需發送到bnb對應節點val url "https://xxx"…

《真·滕王閣序》

《滕工閣序》 西二旗故地&#xff0c;后廠新府。 星分百度網易&#xff0c;地接騰訊阿里。 襟PRD而帶OKR&#xff0c;控需求以引撕逼。 物華天寶&#xff0c;龍光射工卡芯片&#xff1b;人杰地靈&#xff0c;徐孺坐產品經理之榻。 工位霧列&#xff0c;碼農星馳。 臺積電…

云盤搭建筆記

報錯問題&#xff1a; No input file specified. 偽靜態 location / {if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last;break;} } location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last; break; } } 設…

如何打造安全穩定的亞馬遜采購測評自養號下單系統?

在當今的電商領域&#xff0c;亞馬遜作為全球領先的在線購物平臺&#xff0c;其商品種類繁多&#xff0c;用戶基數龐大&#xff0c;成為了眾多商家和消費者的首選。而對于一些需要進行商品測評或市場調研的用戶來說&#xff0c;擁有一個穩定、安全的亞馬遜賬號體系顯得尤為重要…

c語言數據結構 單循環鏈表設計(完整代碼)

單鏈表的增刪查改代碼&#xff1a; 1.創建結構體 // 結構體類型的創建 struct node {int data; // 數據域struct node *next; // 指針域 };2.創建節點&#xff0c;節點的存儲在malloc申請的空間內&#xff0c;也就是堆空間。 // 創建節點 struct node *create_node…

筆記本電腦關不了機是怎么回事 這有解決方法

在快節奏的現代生活中&#xff0c;筆記本電腦已成為我們工作、學習和娛樂的得力助手。在使用電腦的過程中&#xff0c;筆記本電腦突然關不了機了&#xff0c;怎么回事&#xff1f;下面驅動人生就來講一講筆記本電腦不能正常關機的解決方法&#xff0c;有需要的可以來看看。 一、…

Pytest基礎使用

概述 Pytest是Python里的一個強大的測試框架,靈活易用,可以進行功能,自動化測試使用,可以與Requests,Selenium等進行結合使用,同時可以生成Html的報告。 一、Pytest的基本使用 在未指定Pytest的配置文件時,會對以下文件進行執行: test_*.py,如:test_1.py*_test.py…

服務的拆分數據的遷移

參考&#xff1a; 數據遷移調研

【動態規劃篇】91. 解碼方法

91. 解碼方法 題目鏈接&#xff1a; 91. 解碼方法 題目敘述&#xff1a; 一條包含字母 A-Z 的消息通過以下映射進行了 編碼 &#xff1a; “1” -> ‘A’ “2” -> ‘B’ … “25” -> ‘Y’ “26” -> ‘Z’ 然而&#xff0c;在解碼已編碼的消息時&#xff0c;你…

使用【docker】+【shell】腳本半自動化部署微服務項目

一.前言 以下是一個基于 ?Docker Shell腳本? 的半自動化部署方案&#xff0c;包含鏡像構建、容器管理、網絡配置和日志監控等核心功能&#xff0c;適用于大多數Web應用或微服務項目。 二?.目錄結構 三.腳本代碼實現 1.?Shell腳本實現 (deploy.sh) #!/bin/bash# 設置顏…

每天一道算法題-兩數相加

給你兩個 非空 的鏈表&#xff0c;表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的&#xff0c;并且每個節點只能存儲 一位 數字。 請你將兩個數相加&#xff0c;并以相同形式返回一個表示和的鏈表。 你可以假設除了數字 0 之外&#xff0c;這兩個數都不會以 0 …