vue diff算法全理会(4)

下面是复制其他博主的文章,以为写的挺好的 原文地点 :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] }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsjfdz.html