下面是复制其他博主的文章,以为写的挺好的 原文地点 :github.com/liutao/vue2…
乍一看这一块代码,大概有点儿懵。详细内容其实不巨大,我们先概略看一下整个判定流程,之后通过几个例子来具体过一下。
oldStartIdx、newStartIdx、oldEndIdx、newEndIdx都是指针,详细每一个指什么,相信各人都很明白,我们整个较量的进程,会不绝的移动指针。
oldStartVnode、newStartVnode、oldEndVnode、newEndVnode与上面的指针一一对应,是它们所指向的VNode结点。
while轮回在oldCh或newCh遍历竣事后遏制,不然会不绝的执行轮回流程。整个流程分为以下几种环境:
1、 假如oldStartVnode未界说,则oldCh数组遍历的起始指针后移一位。
if (isUndef(oldStartVnode)) { oldStartVnode = oldCh[++oldStartIdx] // Vnode has been moved left }
注:见第七种环境,key值沟通大概会置为undefined
2、 假如oldEndVnode未界说,则oldCh数组遍历的起始指针前移一位。
else if (isUndef(oldEndVnode)) { oldEndVnode = oldCh[--oldEndIdx] }
注:见第七种环境,key值沟通大概会置为undefined
3、sameVnode(oldStartVnode, newStartVnode),这里判定两个数组起始指针所指向的工具是否可以复用。假如返回真,则先挪用patchVnode要领复用dom元素并递归较量子元素,然后oldCh和newCh的起始指针别离后移一位。
else if (sameVnode(oldStartVnode, newStartVnode)) { patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue) oldStartVnode = oldCh[++oldStartIdx] newStartVnode = newCh[++newStartIdx] }
4、sameVnode(oldEndVnode, newEndVnode),这里判定两个数组竣事指针所指向的工具是否可以复用。假如返回真,则先挪用patchVnode要领复用dom元素并递归较量子元素,然后oldCh和newCh的竣事指针别离前移一位。
else if (sameVnode(oldEndVnode, newEndVnode)) { patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue) oldEndVnode = oldCh[--oldEndIdx] newEndVnode = newCh[--newEndIdx] }