重新學習 React 二 Diffing 演算法

2021-09-24 07:18:57 字數 1335 閱讀 8272

前幾天面試問道 react 的相關知識,對我打擊比較大,感覺對 react 認識非常膚淺,所以在這裡重新梳理一下,想想之前沒有仔細思考過的東西。

另外有說的不對的地方還請幫我指正一下,先謝謝各位啦。

目錄索引:

我們知道,react 執行 render() 函式時,會生成一次虛擬 dom,當元件再次更新時,會再生成一顆新的樹,然後 react 會對比兩棵樹的異同,執行更新演算法。react 通過如下方法比較 dom 的異同,其複雜度為 o(n):

當對比兩顆樹時,react 首先比較兩棵樹的根節點。不同型別的根節點元素會有不同的形態。

當根節點為不同型別的元素時,react 會拆卸原有的樹並且建立起新的樹。舉個例子,當乙個元素從變成或者 dom 節點被銷毀,都會觸發乙個完整的重建流程。

當比對兩個相同型別的 react 元素時,react 會保留 dom 節點,僅比對及更新有改變的屬性。

如下所示,當更新 style 屬性時,react 僅更新有所更變的屬性,而 title 屬性不會被修改。

classname="before"

title="stuff" />

classname="after"

title="stuff" />

複製**當乙個元件更新時,元件例項保持不變,這樣 state 在跨越不同的渲染時保持一致。react 將更新該元件例項的 props 以跟最新的元素保持一致,並且呼叫該例項的 componentwillreceiveprops() 和 componentwillupdate() 方法。

如果乙個列表沒有 key 值,一旦陣列增加或者刪除,react 就無法知道那些元素是不變的,那些的改變了的。但是當子元素擁有 key 時,react 使用 key 來匹配原有樹上的子元素以及最新樹上的子元素。以下例子在新增 key 之後使得之前的低效轉換變得高效:

key="2015">dukeli>

key="2016">villanovali>

ul>

key="2014">connecticutli>

key="2015">dukeli>

key="2016">villanovali>

ul>

複製**

現在 react 知道只有帶著 '2014' key 的元素是新元素,帶著 '2015' 以及 '2016' key 的元素僅僅移動了。

關於 key 值,一定要知道其作。自己在寫**的時候盡量不要採用 index 或者隨機數作為 key,因為這樣不但沒有獲得 react 優化演算法的加持,而且會讓自己的資料出現錯亂。

重新學習makefile

今天回顧了一下makefile,做下筆記 首先準備幾個簡單的檔案 add.c head.h main.c mul.c sub.c 然後第一版 makefile 然後第二版 gcc c main.c o main.o 然後第三版 makefile 的語法跟shell 很像 第四版 目標 依賴 tab ...

重新學習struts

這就是所謂的一邊工作一邊學習。今天準備把給公司寫個管理頁面,按照之前的路數,寫起來應該挺快,但是不太規範。也就沉下心來學習一下了。第二個學習的是,異常處理。也是在學校的時候,聽老師說過,struts2有提供乙個異常處理機制。平常我們有些異常處理,會在 中寫try catch。public strin...

mysql重新學習筆記

mysql命令複習 desc table 列式展示 alter add 增加列 delete和 truncate table的區別 1.delete dml語言 資料還可以找回來,恢復回來 逐條刪除 刪除速度要慢一些 可以有條件的刪除。delete from 表名 where 條件 2.trunca...