详细参考snabbdom的js/src/dom中的patch和patch.js
1. 新老节点替换规则
节点替换规则有以下三种情况,其中第三种情况最为复杂,并且分为有children和没有children情况
如果新老节点不是同一个节点名词,那么就暴力删除旧的节点,创建插入新节点。
只能是同级比较。跨级,例如在源节点上添加一个父节点,就会创建插入新节点。
如果是相同的元素节点,有分为很多情况
(1) 新节点没有children
如果新的节点没有children,那就证明新节点是文本,那直接把旧的替换成新的文本
(2) 新节点还有children
新的有children,旧的也有 =》 就是diff算法核心,请看第2章分析
新的有children,旧的没有 =》 创建元素添加(把旧的内容删除清空掉,增加新的)
2. diff算法的核心(最复杂的情况)
对于新旧节点,使用指针来判断各种情况,从第一种方案开始,如果第一种方案不对立马切换到下一种方案,下边几种同理
1、 旧前和新前
旧指针++,新指针++
2、 旧后和新后
旧指针–,新指针–
3、 旧前和新后
旧指针++,新指针–
4、 旧后和新前
旧指针–,新指针++
5、 以上都不满足条件 ==》查找
新指针++,新的添加到页面上,并且新在旧的中有,要给旧的赋值成undefined
6、 创建或删除
详细请看工程文件的 updateChildren.js 和b站Vue面试题后面几章