React的diff演算法主要是兩個Tree的比較。
傳統的Tree diff演算法複雜度是O(n^3),React是演算法通過一些策略將複雜度將為O(n).
1. 優化策略
1. 網頁中的DOM跨層級移動的特別少,可以忽略不計
2. 相同型別的元件生成相似的樹形結構,不同型別的元件生成不同的樹形結構
3. 同一層級的節點,可以通過唯一id來區分
2. 優化演算法
基於以上的策略,React對diff演算法進行了一下優化
1. tree diff
只對同一層級的節點進行比較,跨層級移動,直接銷燬子樹,在目的節點完全插入子樹,這樣只需對樹進行一次遍歷,便能完成整個DOM樹的比較
2. component diff
1. 同一型別元件,按照tree diff進行同級比較,並且增加了shouldComponentUpdate鉤子來判斷元件是否發生變化,無變化,不比較,從而節省diff時間
2. 不同型別元件,將元件標記為dirty component,從而替換整個元件下的所有子節點
3. element diff
對於同一層級的element,通過唯一id,可以優化其新增,修改,刪除操作
在開發React元件時,保持DOM結構的穩定有助於提示效能。
參考:https://segmentfault.com/a/1190000004913592
https://segmentfault.com/a/1190000010686582