vue-diff算法-手写-patch与patchVnode


详细参考snabbdom的js/src/dom中的patch和patch.js

1. 新老节点替换规则

节点替换规则有以下三种情况,其中第三种情况最为复杂,并且分为有children和没有children情况

  1. 如果新老节点不是同一个节点名词,那么就暴力删除旧的节点,创建插入新节点。

  2. 只能是同级比较。跨级,例如在源节点上添加一个父节点,就会创建插入新节点。

  3. 如果是相同的元素节点,有分为很多情况

(1) 新节点没有children

如果新的节点没有children,那就证明新节点是文本,那直接把旧的替换成新的文本

(2) 新节点还有children

新的有children,旧的也有 =》 就是diff算法核心,请看第2章分析

新的有children,旧的没有 =》 创建元素添加(把旧的内容删除清空掉,增加新的)

2. diff算法的核心(最复杂的情况)

对于新旧节点,使用指针来判断各种情况,从第一种方案开始,如果第一种方案不对立马切换到下一种方案,下边几种同理

1、 旧前和新前
旧指针++,新指针++
2、 旧后和新后
旧指针–,新指针–
3、 旧前和新后
旧指针++,新指针–
4、 旧后和新前
旧指针–,新指针++
5、 以上都不满足条件 ==》查找
新指针++,新的添加到页面上,并且新在旧的中有,要给旧的赋值成undefined
6、 创建或删除

详细请看工程文件的 updateChildren.js 和b站Vue面试题后面几章


文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论
  目录