1. 根據(jù)key和選擇器來(lái)判斷是否需要比較褪猛,如果不是都相同洁灵,那么刪除舊節(jié)點(diǎn),添加新節(jié)點(diǎn)
2. 如果都相同愿题,則需要比較拌喉,進(jìn)行patchVnode
1.如果oldVnode === node 則沒(méi)有變化
2.判斷是否是text節(jié)點(diǎn)啡省,如果是text節(jié)點(diǎn)溪食,則直接更換text值
3.判斷是否都有子節(jié)點(diǎn)力九,并且子節(jié)點(diǎn)不相同,進(jìn)行updateChildren
4.如果只有newVnode有子節(jié)點(diǎn)塞赂,那么插入子節(jié)點(diǎn)
5.如果只有oldVnode有子節(jié)點(diǎn)泪勒,那么刪除所有子節(jié)點(diǎn)
上面第三步詳解: 3.如果都有子節(jié)點(diǎn),執(zhí)行updateChildren(核心)
有四個(gè)頭尾變量 oldStartIdx newStartIdx oldEndIdx newEndIndex
循環(huán)進(jìn)行同級(jí)比較宴猾,
如果沒(méi)有設(shè)置key
1.oldStartNode 與 newStartNode需要比較圆存,
進(jìn)行patchVnode ,startindex++
2.oldEndNode 與 newEndNode
進(jìn)行patchVnode endIndex—
3.如果oldStartVnode 與 newEndVNode相同
那么oldStartVnode需要移動(dòng)到oldEndVnode后面
4.如果oldEndVnode 與 newStartVnode相同
那么oldEndVnode 需要移動(dòng)到oldStartVnode前面
如果有設(shè)置key
根據(jù)key查找仇哆,如果找到了就換沦辙,沒(méi)有找到就插入
3.最后如果oldStartIndex > oldEndIndex 說(shuō)明old先遍歷完成,把newStartIndex與newEndIndex之間的所有元素當(dāng)成新增的元素
如果最后newStartIndex > newEndIndex 說(shuō)明new先遍歷完成讹剔,把oldStartIndex與newStartIndex之間的node刪除
最后再來(lái)張圖
vue-diff