Vue2 Diff算法
源码位置:src/core/vdom/patch.ts
源码所在函数:updateChildren()
源码讲解:
-
有新旧两个节点数组:
oldCh
和newCh
; -
有下面几个变量:
oldStartIdx 初始值=0
oldStartVnode 初始值=oldCh[0]
oldEndIdx 初始值=oldCh.length - 1
oldEndVnode 初始值=oldCh[oldEndIdx]
newStartIdx 初始值=0
newStartVnode 初始值=newCh[0]
newEndIdx 初始值=newCh.length - 1
newEndVnode. 初始值=newCh[newEndIdx]
-
对比流程
-
新旧数组,从首到尾对比,直到Vnode不相同
2. 新旧数组,从尾到首对比,直到Vnode不相同
3. 旧数组尾和新数组首对比,直到Vnode不同
4. 旧数组首和新数组尾对比,直到Vnode不同
前面4步对比完成后,会有下面三种情况:
(1)旧数组没有剩余元素
针对这种情况,直接将新数组中新增的元素插入到元素6后面
(2)新数组没有剩余元素