React中的虛擬DOM和diff演算法

2021-09-11 18:18:34 字數 1366 閱讀 8861

react原理

我們來想一下如何實現react

第一種方案:

1. state 資料

2.jsx 模板

3. 資料 + 模板 結合, 生成真實的dom

, 來顯示

4. state 發生改變

5. 資料 + 模板 結合, 生成真實的dom

, 替換原始的dom

但這種方案在第五步有著很大的效能缺陷

用新生成的dom去替換原始的dom, 非常消耗效能

第二種方案

1. state 資料

2.jsx 模板

3. 資料 + 模板 結合, 生成真實的dom

, 來顯示

4. state 發生改變

5. 資料 + 模板 結合, 生成真實的dom

, 並不直接替換原始的dom

6. 新的dom

(documentfragment) 和原始的dom 做比對,找差異

7. 找出有差異的dom元素

8. 將有差異的dom元素替換掉舊的dom元素

這種方案同樣存在缺陷

關鍵在於第六步,我們找新dom和原始dom的比對找差異過程中,也很消耗效能,效能提公升並不明顯

第三種方案:虛擬dom

1. state 資料

2.jsx 模板

3. 生成虛擬dom

(js物件)

, 用js物件描述dom資訊

, children:

}4. 借助虛擬dom

, 生成真實的dom

, 來顯示

'root'

>

hello, world<

/p>

<

/div>

5. state 發生改變

6. 生成新的虛擬dom

7. 比較原始虛擬dom和新的虛擬dom的差異

8. 直接操作dom,改變有差異的內容優點:生成 js 物件很快, 所以在兩個js物件中找差異 損耗效能很小

極大的提公升了效能

diff演算法用於比較虛擬dom之間的差異

diff演算法通過逐級的去比較兩顆節點樹的差異,大大降低了複雜性

假設我們有乙個元件,它在乙個迭代中渲染了5個元件,而下一次渲染的時候在元件列表的中間插入乙個新的元件。 只是通過這個資訊真的很難知道如何在兩個元件列表之間進行對映。

預設情況下,react將先前列表的第乙個元件與下乙個列表的第乙個元件相關聯,等等。您可以提供乙個key屬性,以幫助react去找到他們的對映關係。 在實際中,這通常很容易把剛剛插入的元件從他們當中找出來。

React 中的虛擬DOM

react 的重新渲染,效能是很高的。因為它引入了虛擬dom的概念。呃,來看一下,render 函式渲染頁面的幾種做法。前兩步都是拿到state 資料 與 jsx模版。第一種就是比較樸素的方式。第二種方式雖然不用完全替換,但是也需要比對兩個dom。第三種是虛擬dom方式。虛擬dom 本質上就是 js...

react中的虛擬DOM

資料驅動原理 用虛擬dom 1.state資料 2.jsx模板 3.資料 模板相結合,生成虛擬dom 虛擬dom就是乙個js物件,用它來描述真實的dom div span hello 損耗了極小的效能 4.用虛擬dom的結構生成真實的domhello 5.state 發生變化 6.資料 模板 生成新...

對react中虛擬dom和diff演算法的理解

直接使用dom進行操作時排版與重繪的效率低,速度慢。例如插入乙個dom元素,元素本身或者繼承很多屬性,還需要註冊很多方法,導致乙個建立乙個簡單的dom也要消耗很多時間。虛擬dom是在首次渲染dom時,多了一層虛擬dom的計算,在dom的基礎上建立了乙個抽象層。當有改動時,會生成乙個新的虛擬dom與上...