vue的diff算法

本文介绍了Vue的Diff算法,用于高效地更新虚拟DOM。主要步骤包括:检查oldnode是否存在,同一节点的比较,文本节点的替换,非文本节点的处理,以及关键的子元素遍历算法,通过key值优化提高效率。Vue的Diff算法避免了传统算法的高时间复杂度,实现了O(n)的时间复杂度。
摘要由CSDN通过智能技术生成

vue的diff算法

有两个dom,vnodeoldnode

一、首先 判断oldnode存在情况,不存在直接用vnode创建元素。

function patch (oldVnode, vnode) {
    // some code
    if (sameVnode(oldVnode, vnode)) {
    	patchVnode(oldVnode, vnode)
    } else {
    	const oEl = oldVnode.el // 当前oldVnode对应的真实元素节点
    	let parentEle = api.parentNode(oEl)  // 父元素
    	createEle(vnode)  // 根据Vnode生成新元素
    	if (parentEle !== null) {
            api.insertBefore(parentEle, vnode.el, api.nextSibling(oEl)) // 将新元素添加进父元素
            api.removeChild(parentEle, oldVnode.el)  // 移除以前的旧元素节点
            oldVnode = null
    	}
    }
    // some code 
    return vnode
}

二、oldnode存在时,调用sameVnode函数,判断是不是同一个node,不是同一个node的时候,删除oldnode,新加vnode。

function sameVnode (a, b) {
  return (
    a.key === b.key && (
      (
        a.tag === b.tag &&
        a.isComment === b.isComment &&
        isDef(a.data) === isDef(b.data) &&
        sameInputType(a, b)
      ) || (
        isTrue(a.isAsyncPlaceholder) &&
        a.asyncFactory === b.asyncFactory &&
        isUndef(b.asyncFactory.error)
      )
    )
  )
}

三、是同一个node的时候,判断vnode是不是文本节点,vnode是文本节点的时候,直接用vnode替换oldnode里面的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值