1. 程式人生 > >react中的虛擬Dom與diff演算法

react中的虛擬Dom與diff演算法

傳統: 1.state 資料 2.jsx模板 3.資料和模板結合生成真實dom進行掛載。 4.資料state發生改變 5.資料 + 模板結合,重新生成dom,進行替換原有dom片段。 缺陷: 第一次生成了一個完整的dom片段, 第二次又生成了一個完整的dom片段。 第二次的dom替換第一次的dom,非常的消耗效能

改進: 1.state資料 2.jsx模板 3.資料 + 模板 結合,生成真實dom 進行掛載 4. state 資料發生改變 5.資料 + 模板 結合,生成真實dom,並不直接替換原始的dom 6.新的dom 和原始的dom 做對比,找差異 // 真實dom做對比 。效能消耗 7. 找出哪裡發生了變化 8. 只用新的發生了變化的部分,替換掉老的對應的之前的部分。 效能有所提升 缺陷: 效能的提升並不明顯,有所消耗也有所提升。

React:

1.state 資料 2. jsx 模板 3. 資料 + 模板 生成虛擬dom(虛擬dom就是一個js物件,用它來描述真實dom) // 效能消耗極小 [‘div’,{ id : ‘abc’ } , [‘span’, {} , ’ hello world’ ] ] 4. 用虛擬dom的解構,生成真實dom來顯示 <div id='abc'><span>hello world</span></div> 標籤 - 屬性 -內容 標籤- 屬性-內容 5. state 資料發生變化 6. 資料 + 模板 生成新的虛擬dom (極大的提示了效能) <div id='abc'><span>bye bye </span></div>

7.比較原始虛擬dom和新的虛擬dom的區別,找到發生變化的地方(實質是兩個js物件進行比對,極大的提示效能) 8.直接操作dom,改變發生變化的地方

虛擬dom實際上生成了一個js物件,生成一個js物件和生成一個真實dom相比,效能損耗是極低的。 流程示意: jsx → createElement → 虛擬dom(js物件) → 真實dom React.createElement(‘div’, {屬性:‘屬性值’} , ‘內容’)

虛擬dom的好處: 1.效能提升 。dom比對變成 js物件的比對 2.使得跨端應用得以實現 。React Native (js物件 → 生成原生應用元件)

Diff演算法 虛擬dom的比對(js物件)方式,就叫做diff演算法。 setState是非同步的(呼叫時間間隔小的多次的setState呼叫合併成一次的setState呼叫)提升react底層的效能 在這裡插入圖片描述

  1. 關鍵:同級比較 同層比對 演算法簡單 當某一層的dom不一致時,把原始的dom不一致之後的所有的dom進行刪除,重新生成節點下所有的dom,替換原始的dom。當有一層的節點不一致時,不會再往下進行比較,而是刪除不一致節點之後的所有dom,重新生成不一致節點之後的dom。 key值的關鍵。 形成一一對應的比對關係