diff演算法的原始碼實現比較複雜。這裡先對演算法過程和作用進行詳細梳理。
diff 的出現,就會為了減少更新量,找到最小差異部分dom,只更新差異部分dom就好了。這樣消耗就小一些。資料變化一下,沒必要把其他沒有涉及的沒有變化的dom 也替換了。總之一句話:頻繁操作dom比較耗時,先通過diff演算法比較新舊vnode可以定位出差別,來實現最少操作dom的更新1, 新舊節點:
新舊節點指的都是vnode 節點,vue 只會比較 vnode 節點,而非dom。因為 vnode 是 js 物件,不受平台限制,所以以它作為比較基礎,**邏輯後期不需要改動拿到比較結果後,根據不同平台呼叫相應的方法進行處理就好了2, 父節點是相同節點怎麼理解:
diff演算法中,新舊節點的比較是同層級的比較。比如下圖出現的 四次比較(從 first 到 fouth),他們的共同特點都是有相同的父節點。比如藍色部分的比較,新舊子節點的父節點是相同節點 1。比如紅色部分的比較,新舊子節點的父節點都是 2
diff演算法設計的「指導思想」是節點復用。因此,能復用的節點就絕不建立。可以復用的情況具體分以下幾種情況:
1, 兩個節點相同,但不在相同層級上,無法復用
2,兩個節點相同,在同一層級,但父節點不同,無法復用
3,同層同父節點,可以復用
【vue原理】diff - 白話版mp.weixin.qq.com
diff演算法 diff演算法介紹
diff演算法的作用 計算出virtual dom中真正變化的部分,並只針對該部分進行原生dom操作,而非重新渲染整個頁面。傳統diff演算法 通過迴圈遞迴對節點進行依次對比,演算法複雜度達到 o n 3 n是樹的節點數,這個有多可怕呢?如果要展示1000個節點,得執行上億次比較。即便是cpu快能執...
vue Diff 演算法的執行過程
patchvnode 這個函式做了以下事情 其他幾個點都很好理解,我們詳細來講一下updatechildren,如下 updatechildren parentelm,oldch,newch else if oldendvnode null else if newstartvnode null el...
Diff演算法研究
在unix linux的世界裡面,如果我們需要比較兩個檔案,就會用乙個比較的命令 diff。而這個diff的原理是什麼呢?在diff裡面,我們比較的兩個檔案叫做old和new,而一般是按行來比較。這裡我們可以抽象成乙個字串的比較,比如 old abcdefger new abdefereger 那麼...