最近從vue使用轉到react使用,vue
以前研究過vue的diff算法,閒來看了看react的diff源碼,寫一點本身的看法react
diff算法發生在虛擬dom上算法
判斷是否同一個節點:selector和key都要同樣dom
diff規則:函數
若是條件1知足,新舊節點頭部指針日後移。oop
若是條件2知足,新舊節點尾部指針往前移。判斷是否新的子節點先循環完(頭尾位置指針判斷),是:就是刪除了節點,否:新增了節點,新增的節點按照條件4添加性能
若是條件3知足,須要移動新的頭部子節點到舊的尾部子節點後面spa
若是條件4知足,須要移動新的頭部子節點到舊的頭部子節點前面指針
若是4種都未匹配到,而且指針條件未知足,須要loop匹配索引
vue在把被移動的節點和匹配的節點設置爲undefined
從左往右依次對比,利用元素的index和標識lastIndex進行比較,若是知足index < lastIndex就移動元素,刪除和添加則各自按照規則調整
跨層不比較,同層比較,跟vue同樣
新節點的位置是lastIndex,舊節點的位置是index。重新的節點中依次讀取節點索引,對比舊的節點數據索引
最噁心的狀況:若是把最後一個元素移到最前面,react會依次移動節點向後
類似的地方:vue和react的diff算法,都是不進行跨層級比較,只作同級比較。
不一樣點: