react diff

来源:https://www.cnblogs.com/yadiblogs/archive/2019/07/03/11129206.html
-Advertisement-
Play Games

傳統diff 通過迴圈遞歸對節點的依次對比,複雜度是O(n3) react diff react對傳統diff進行了優化,將複雜度降為O(n) react基於這幾個前提對diff進行了優化: 忽略跨層級操作,因為DOM節點跨層級操作很少。 不同類的組件,則會生成不同的樹形結構,相同類的組件,會生成相 ...


傳統diff

通過迴圈遞歸對節點的依次對比,複雜度是O(n3)

react diff

react對傳統diff進行了優化,將複雜度降為O(n)

react基於這幾個前提對diff進行了優化:

  • 忽略跨層級操作,因為DOM節點跨層級操作很少。
  • 不同類的組件,則會生成不同的樹形結構,相同類的組件,會生成相似的樹形結構。
  • 對同一層級的一組子節點,可以通過唯一key進行區分。

1 tree diff

只會對相同層級的DOM節點進行比較,只需要一次遍歷,便可以完成整棵樹的遍歷。如果節點不存在,則該節點及其子節點都會被刪掉,對於不同層級的節點,只有創建和刪除操作。

2 component diff

  • 針對同類型組件,按照tree diff策略對比。如果開發人員確切知道virtual DOM沒有變化,react提供的shouldComponentUpdate()方法可以直接省去tree diff。
  • 針對不同類型組件,則直接判斷該組件為dirty component,從而替換整個組件下的所有子節點。

3 element diff

當節點處於同一層級,可能除夕只需要對這些節點進行移動,不需要每次都刪除創建,react剔除添加唯一key來區分。react通過判斷key是否存在相同節點,如果存在,再進行判斷進行移動操作。不存在再進行相應的創建刪除。

與vue的diff區別

  • 判斷2個節點是否相同:vue認為className不一樣,就不同,react則認為相同,只是屬性不同,只需要更新其屬性。
  • 同一層級對比:Vue從兩端至中間對比,react從左至右對比。react策略存在短板,如果一個集合只吧最後一個移到第一個,react會移動前面所有節點,vue只移動最後一個節點到最前面。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 【問題來源】 不知道大家有沒有做過這樣的事,在Android開發的過程中,通過文本直接修改代碼,不打開編譯器,然後提交讓同時編譯運行。這時Android編譯就會報錯,指定修改的文件開始位置,顯示非法字元。 【解決方法】 找到非法字元文件,使用工具 NotePad++ 打開文件,設置格式為UTF-8 ...
  • Viewpager + Fragment 跳轉Activity報錯android.os.TransactionTooLargeException: data parcel size xxxxx bytes Viewpager + Fragment 跳轉Activity報錯android.os.Tra ...
  • 收藏常用的蘋果開發站點 www.apple-dev.cn www.cocoachina.com ...
  • sub和sup元素會輕微地增大行高。 幸好,用一點CSS就可以修複這個問題。 來自Nicolas Gallagher和Jonathan Neal的normalize.css(http://necolas.github.com/normalize.css/)。 他們借用了https://gist.gi ...
  • 一、子元素選擇器 1.定義:找到指定標簽中所有特定的直接子元素,然後設置屬性 2.格式: 3.釋義:先找到叫做“標簽名稱1”的標簽,然後在這個標簽中查找所有直接子元素名稱叫做“標簽名稱2”的元素 : (1)子元素選擇器智慧查找兒子,不會查找孫子,重孫子等等 (2)子元素選擇器之間需要用“>”符號相連 ...
  • 表格的隔行變色樣式,checkbox的全選+反選功能實現商品購物車頁面的結算功能。 ...
  • [2019.07.03 學習筆記2] 1.定義列表,沒有項目符號,type無法起作用。 2.自定義列表以<dl>標簽開始,自定義列表項始於<dt>標簽,每個自定義列表項的定義始於<dd>。 ...
  • [2019.07.03 學習筆記1] 1.定義有序列表,有順序。 2.預設情況下採用數字進行標記,有序列表始於<ol>標簽,每個列表項始於<li>。 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <t ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...