diff算法

2020-05-20  本文已影响0人  看到这朵小fa了么

vue引入vdom的优势

vue在已经知道哪里更新的前提下还是引入的VDOM,这是因为除了对更新的优化之外,VDOM还有其他的优势
1、VDOM将dom结构抽象出来,上层的组件同样可以抽象化具有更高的适配能力
2、VDOM的结构一致,可以跨平台渲染 如weex
3、配合diff算法进行比对更新,在最小颗粒度和对比范围找到平衡点

diff算法

https://blog.csdn.net/chenzhizhuo/article/details/101531228

平层对比减少时间复杂度n3到n,比对过程是OldVnode和vnode进行对比,以vnode的视图为结果

patchVnode()
// 判断两个节点是否值得进行比对的方法是sameVnode()
function sameVnode (a, b) {
  return (
    a.key === b.key &&  // key值
    a.tag === b.tag &&  // 标签名
    a.isComment === b.isComment &&  // 是否为注释节点
    // 是否都定义了data,data包含一些具体信息,例如onclick , style
    isDef(a.data) === isDef(b.data) &&  
    sameInputType(a, b) // 当标签是<input>的时候,type必须相同
  )
}
updateChild()

其中难点在于updateChild的过程:

例题分析

功能函数

emptyNodeAt 将一个真实的无子节点的dom节点转化为vnode形式

如:<div id='a' class='b c'></div>

将转换为{sel:'div#a.b.c',data:{},children:[],text:undefined,elm:<div id='a' class='b c'>}

sameVnode 比较两个vnode节点是否相似 相似patch 不同直接进行移除和添加

createElm 通过vnode来创建真实的dom节点,并将其赋值给vnode.elm 。递归将vnode节点构建成dom树 触发全局的create钩子 推进insertedVnodeQunue ,实现批量插入触发insert回调

removeVnodes 批量删除dom节点 配合invokeSestoryHook触发destory回调和createRmCb 对remove回调进行计数

addVnodes 将vnode转化后的dom节点插入daodom树的指定位置中

createRmCb当所有remove钩子触发完毕才会将节点从父节点移除

上一篇下一篇

猜你喜欢

热点阅读