1. 程式人生 > >React面試必會--React的Diff演算法

React面試必會--React的Diff演算法

使用React或者RN開發APP如果不知道Diff演算法的話簡直是說不過去啊。畢竟“知其然,知其所以然”這句老話從遠古喊到現代了。

以下內容基本是官網文章的一個總結、壓縮。這次要謙虛一下,畢竟深入研究RN的時間不多,如果有什麼理解的不對的地方還請各位讀者指正。

React的元件在渲染之後組成了一個樹形結構。在React繪製的時候,會在記憶體裡對應每一個元件建立一個節點,並最終形成一個和元件樹結構一樣的樹。我們就叫這個樹叫影子樹(這個叫法不是出自官方)。我們可以理解為這個影子樹包含了React App組建的結構和一些屬性值

在元件發生變化的時候(一般是呼叫了setState),React會形成一個影子樹二號。然後對比影子樹1號和影子樹2號的不同。

我們知道對比兩個樹的最小不同的時間複雜度是O(n3
),n是樹裡的節點數。這個複雜度下,稍有量級的應用都會遇到一個問題:無法忽略的慢。於是,FB的同學們使用了更加高效的啟發式演算法,把複雜度降低到了O(n)。

但是,不管是什麼演算法最後都需要對比兩個節點的不同。有三種情況需要考慮:

一、節點之間的比較

節點,英語裡的Node,包括兩種型別:一個是React元件,一個是HTML的DOM。下文也是同樣的含義。

節點型別不同

如果是HTML DOM不同的話,直接使用新的替換舊的。

如果是元件型別不同的話也直接使用新的替換舊的。

HTML DOM型別相同

在React裡樣式並不是一個純粹的字串,而是一個物件,這樣的話在樣式發生改變的時候只需要改變替換變化以後的樣式。修改完當前節點之後,遞迴處理該節點的子節點。

元件型別相同

元件型別相同的,使用React機制處理。一般是使用新的props替換掉舊的props,並在之後呼叫元件的componentWill/DidReceiveProps方法,之前的元件的render方法會被呼叫。節點的比較機制開始遞迴作用於這個它的子節點上。

二、兩個列表之間的比較

一列節點中的一個發生了改變,React並沒有什麼好方法來處理這個問題。迴圈新舊兩個列表,並找出不同是React唯一的處理方法。

但是,有一個可以把這個演算法的複雜度降低的辦法。那就是我們在生成一列節點的時候給每一個節點上新增一個key。這個key只需要在這一列節點中唯一,不需要全域性唯一

三、取捨

需要注意的是,上面的啟發式演算法是基於兩點假設:
*型別想聽的節點總是生成同樣的樹,而型別不同的節點也總是生成不同的樹。
*可以為多次render都表現穩定的節點設定key。

上面的節點之間的比較演算法基本就是基於這兩個假設而實現的。也就是要提高React應用的效率,需要我們按照這兩點假設來開發

否則,React會重獲整個APP。那就是噩夢一樣的情況了。

相關推薦

React面試--React的Diff演算法

使用React或者RN開發APP如果不知道Diff演算法的話簡直是說不過去啊。畢竟“知其然,知其所以然”這句老話從遠古喊到現代了。 以下內容基本是官網文章的一個總結、壓縮。這次要謙虛一下,畢竟深入研究RN的時間不多,如果有什麼理解的不對的地方還請各位讀者指正。

【程序員筆試面試——排序②】Python實現 計數排序、基數排序

16px 最大 元素 size medium log n) python實現 count 一、計數排序 概要:     時間復雜度O(n),空間復雜度O(k),k是輸入序列的值的範圍(最大值-最小值),是穩定的。計數排序一般用於已知輸入值的範圍相對較小,比如給公司員工的身高

運維面試

日誌審計 bin bios 二進制文件 shu 創建文件 關機 計數 pts 非原創,源鏈接https://blog.csdn.net/zhongqi2513/article/details/62044299 1.解釋下什麽是GPL,GNU,自由軟件? GPL:(通用公共許

Android面試知識點 - ANR詳解

除了 信息 load 本地 leg 主線程 阻塞 tst 第一次 最近在公司出差過多,感覺自己快被廢了,這時候正好有大公司給了面試機會,於是就去試試,雖然最後Tencent沒有要我,但是過程中讓我對Android有了更新的認知,把我的對於Android的理解又提升了

jvm面試基本知識

col 信息 native 標記 borde 知識 加載 roo 委托 內存: 堆區 new的對象 虛擬機棧 局部變量 本地方法棧 作用是執行native方法 方法區 static變量、類信息、常量 程序計數器 當前線程所執行的字節碼的行號指示器

測試面試sql(1)

     測試一般各種查詢語句用的較多,下面的查詢語句都是需要熟悉的     Course表 Score表 Student表    Teacher表 1,查詢課程編號為“02”的總成績 SELECT *

面試知識------資料庫

事物 它是一個操作序列,這些操作要麼都執行,要麼都不執行,它是一個不可分割的工作單位。事務是資料庫維護資料一致性的單位,在每個事務結束時,都能保持資料一致性 四個基本性質 事物是由一系列操作完成的,具有四個基本性質(ACID) 原子性(Atomicity):原子性是指

阿里面試20道C++面試題!

1、如何初始化一個指標陣列。解析:首先明確一個概念,就是指向陣列的指標,和存放指標的陣列。 指向陣列的指標:char (*array)[5];含義是一個指向存放5個字元的陣列的指標。 存放指標的陣列:char *array[5];含義是一個數組中存放了5個指向字元型資料的指標。 按照題意,我理解為初始化一個存

筆試面試程式碼 以及看書籍

筆試面試必會程式碼 連結串列: 在連結串列中找到第一個含有某值的節點並刪除該結點 從頭到尾列印連結串列 合併兩個排序連結串列 反轉連結串列 連結串列中倒數第k個結點 O(1)時間刪除連結串列結點 複雜連結串列的複製 兩個連結串列的第一個公共結點 二叉樹: 深度優先遍歷

BATJ面試之並發篇

我們 exception 自旋鎖 依次 輸出結果 gin now() size protect 一、線程狀態轉換 新建(New) 可運行(Runnable) 阻塞(Blocking) 無限期等待(Waiting) 限期等待(Timed Waiting) 死亡(Term

BATJ面試之 Spring 篇(一)

綁定 重要 詳情 類信息 建議 ini on() aging 公眾 譯者:深海 校對:方騰飛 出自並發編程網 – ifeve.com 目錄 Spring 概述 依賴註入 Spring beans Spring註解 Spring數據訪問 Spring面向切面編程(AOP

企業面試shell

數字 oldboy base delet ech bsp 企業 too and 企業面試題1: 使用for循環在/oldboy目錄下通過隨機小寫10個字母加固定字符串oldboy批量創建10個html文件,名稱例如為: [[email protected]

Java面試-微服務許可權認證

## 微服務身份認證方案 **1. 單點登入(SSO)** 這種方案意味著每個面向使用者的服務都必須與認證服務互動,這會產生大量非常瑣碎的網路流量和重複的工作,當動輒數十個微應用時,這種方案的弊端會更加明顯。 **2. 分散式 Session 方案** 分散式會話方案原理主要是將關於使用者認證的資訊儲

面試必備:高頻演算法題彙總「圖文解析 + 教學視訊 + 範例程式碼」 排序 + 二叉樹 部分!

排序 所謂排序演算法,即通過特定的演算法因式將一組或多組資料按照既定模式進行重新排序。這種新序列遵循著一定的規則,體現出一定的規律,因此,經處理後的資料便於篩選和計算,大大提高了計算效率。 對於排序: 我們首先要求其具有一定的穩定性 即當兩個相同的元素同時出現於某個序列之中 則經過一定的排序演算法之後

React Native調試實用技巧,React Native開發者的調試技巧

黃色 系列 保持 ont 學習筆記 block 有效 poi ges 在做React Native開發時,少不了的需要對React Native程序進行調試。調試程序是每一位開發者的基本功,高效的調試不僅能提高開發效率,也能降低Bug率。本文將向大家分享React Nati

JVM垃圾回收——物件搜尋演算法與回收演算法

垃圾回收(GC)是JVM的一大殺器,它使程式設計師可以更高效地專注於程式的開發設計,而不用過多地考慮物件的建立銷燬等操作。但是這並不是說程式設計師不需要了解GC。GC只是Java程式設計中一項自動化工具,任何一個工具都有它適用的範圍,當超出它的範圍的時候,可能它將不是那麼自動

深度學習機器學習面試問題準備(

第一部分:深度學習 1、神經網路基礎問題 (1)Backpropagation(要能推倒)    後向傳播是在求解損失函式L對引數w求導時候用到的方法,目的是通過鏈式法則對引數進行一層一層的求導。這裡重點強調:要將引數進行隨機初始化而不是全部置0,否則所有隱層的數值都會與輸入

面試知)的氣泡排序和快速排序

本博文介紹兩個最常被提起的排序演算法:氣泡排序和快速排序。氣泡排序是入門排序演算法,思路比較常規,但確是最耗時的排序演算法,所以聽到氣泡排序笑一笑就好了,千萬不要拿來裝B。另一個是被譽為的面試必知演算法快速排序,以及針對陣列特徵進行優化的“隨機快排”和“平衡快排”。 氣泡排序 (一)概

面試筆試整理3:深度學習機器學習面試問題準備(

第一部分:深度學習 1、神經網路基礎問題 (1)Backpropagation(要能推倒)   後向傳播是在求解損失函式L對引數w求導時候用到的方法,目的是通過鏈式法則對引數進行一層一層的求導。這裡重點強調:要將引數進行隨機初始化而不是全部置0,否則所

程式設計師面試問:你為什麼要離開上一家公司。你怎麼回答?

在進行社招面試時,有一個問題幾乎是必問的: 你為什麼要離開上一家公司? 其實這個問題主要是想試探一下你的核心訴求,並藉此預估一下你在本公司工作的穩定性。常見的答案也無非就是這麼幾種:對薪酬不滿意、幹得不爽,或者是想換個環境。 我遇到過好幾個初次跳槽的求職者