vue diff算法的详解
2021-06-18 16:24:06 0 举报
vue diff算法的详解
作者其他创作
大纲/内容
old有children,vnode没有
是
循环oldCh用sameVnode方法找到节点拿到key
否
vnode和oldNode完全相同
不存在
pathNode方法(更细粒度的去更新)
vnode有text属性
text不相等
直接添加add
vnode尾节点和oldnode尾节点是否相等
old有text,直接清空
多出的oldNode进行删除
updateChildren
使用patchNode进行详细的对比和更新操作
insertBefore插入,patch调用
oldnode节点第一个是否为空
删除oldNode
直接退出
不存在createElm直接创建
vnode和oldnode都是静态节点
直接替换text
更新节点的属性
newnode有key
有
newStart Vnode建立新的检查点
不是
diff更新逻辑描述:1.首先_update进入patch方法(更新全局的方法);path:1.查看oldNode是否存在,不存在则创建createEl;2.比较oldNode和vNode是否相等(sameNode),不相等取oldNode的 parent添加到oldNode前面,删除oldNode;3.如果相等则进入patchNode。patchNode: patchNode属于递归调用。1.如果oldNode和vnode完全相同则跳出;2.如果oldNode和vNode属于静态方法直接跳出; 3.更新静态属性;4.如果vnode有text属性,比较vnode.text和oldnode.text是否相等,不相等则直接更新;4.如果vnode 没有text属性,且vnode和oldnode都有children,且children不同则进入,updateChildren;如果oldNode有children, vnode没有children则直接删除,如果vnode有children则添加。upDateChildren: 创建newstartNodeInd 、newEndNodeInd、oldstartNodeInd 、oldEndNodeInd、newNode、oldNode,利用while 循环oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx; 1.oldstartNode为空,递归++;2.oldEndNode为空 endInd--;3.前两步为缩小old空值,oldStartNode和newStartNode如果相等,patchNode递归,ldStartVnode = oldCh[++oldStartIdx],newStartVnode = newCh[++newStartIdx];4.尾部对比,同3;5.oldStartNode和 newEndNode对比,如果相等执行插入操作,;6.oldEndNode和newStartNode对比同5;7.都没有匹配到,且 oldNode没有关系,建立oldNode index与key一一对应关系;7.如果newNode有key,则找到newNode与oldNode对 应key的值;没有则通过sameVnode去查找;8.如果没有找到则创建,找到则进行深度比较,移动oldNode,清空当 前;9.最后进行判断多的删除,少的添加。虚拟dom的优势以及必然性:dom渲染和js引擎不属于同一个线程,每次通信需要browse线程进行沟通开销巨大,真实的dom操作,如果同时执行十次操作会建立十次连接,虚拟dom通过AST进行解析,Node生成dom tree(一个对象),只操作dom,通过promise进行队列维护收集依赖,合并更新,通过新老vnode节点进行diff比较,找到最优的更新策略。watcher在2.0后加大了监控的颗粒度,进行组件间依赖收集。
没有
找到节点查看是否为同一根节点
移动到当前节点前面
直接删除
sameVnode判断节点是否相同
vnode和oldNode都有children
patchVnode,ldCh[idxInOld] = undefined
递归调用vnodeEnd--oldEnd--
children是否相等
找不到节点
oldNode和vnode是否是同一个节点
存在
oldStartVnode = oldCh[++oldStartIdx];递归赋值
path方法
oldNode最后一个节点是否为空
更新updateChildren
vnode有childrenold没有
建立key和index的关系
oldVnode是否存在
用newNode的key建立关系
oldEndVnode = oldCh[--oldEndIdx]
使用oldNode的parent,使用vnode去创建真实节点并插入到oldnode后面
sameNode判断新老节点,只要不满足就删除老的节点去创建新的节点
递归调用patchnode,vnodeInd++、oldNodeInd++
收藏
0 条评论
回复 删除
下一页