React Diff 會幫助咱們計算出 Virtual DOM 中真正發生變化的部分,而且只針對該部分進行實際的DOM操做,而不是對整個頁面進行從新渲染html
傳統的diff算法是使用循環遞歸對節點進行依次對比,複雜度爲O(n^3),效率低下。react
React 經過使用 updateDepth 對 虛擬DOM樹進行層次遍歷算法
兩棵樹只對同一層級節點進行比較,只要該節點不存在了,那麼該節點與其全部子節點會被徹底刪除,不在進行進一步比較。性能
只須要遍歷一次,便完成對整個DOM樹的比較。優化
React diff 只考慮同層次的節點位置變換,若爲跨層級的位置變化,則是建立節點和刪除節點的操做。即在新位置上從新建立相同的節點,而刪除原位置的節點。3d
Tips: React 官方建議不要進行DOM節點的跨層級操做,但是經過CSS來隱藏,顯示節點,而不是真正地刪除和添加DOM節點,保持穩定的DOM結構會對性能提高有幫助。code
shouldComponentUpdate()
方法來判斷是否React官方文檔對於 shouldComponentUpdate的介紹component
dirty component
,從而替換整個組件的全部節點。就算結構再類似的組件,只要 React 判斷是不一樣的組件,就不會判斷是否爲不一樣類型的組件,就不會比較其結構,而是刪除組件以及其子組件,並建立新的組件以及其子節點。orm
對於處於同一層級的節點,React diff 提供了三種節點操做: 插入,移動,刪除cdn
按新集合中順序開始遍歷
lastIndex
就認爲 B 對於集合中其餘元素位置無影響,不進行移動,以後lastIndex
= max(index, lastIndex) = 1lastIndex
= 1, 知足 index < lastIndex
, 則對A進行移動操做,此時lastIndex
= max(Index, lastIndex) = 1lastIndex
=max(index, lastIndex) = 3lastIndex
= max(index, lastIndex) = 31.同上面那種情形,B不進行移動,lastIndex
=1
2.新集合中取得E,發現舊中不存在E,在 lastIndex
處建立E,lastIndex
++
3.在舊集合中取到C,C不移動,lastIndex
=2
4.在舊集合中取到A,A移動到新集合中的位置,lastIndex
=2
5.完成新集合中全部節點diff後,對舊集合進行循環遍歷,尋找新集合中不存在但就集合中的節點(此例中爲D),刪除D節點。
此例中D直接從最後一位提高至第一位,致使lastIndex
在第一步直接提高爲3,使ABC在進行index與lastIndex的判斷時均處於 index < lastIndex 的狀況,使ABC都須要作移動操做。因此咱們應該減小將最後一個節點提高至第一個的操做,若是操做頻率較大或者節點數量較多時,會對渲染性能產生影響。
參考資料
《深刻React技術棧》