diff整理

diff整理

  • 虚拟dom:用js来表达真实dom

  • dom渲染:
    真实dom:真实dom->页面节点
    虚拟dom:虚拟dom->真实dom->页面节点

  • 虚拟dom算法 = 虚拟dom + diff算法

  • diff算法(时间复杂度O(n)):

    Diff算法比较只会在同层级进行, 不会跨层级比较

    • patch方法
      sameVnode方法 — 判断当前同层虚拟节点是否为同一类型的虚拟标签
      是:patchVnode方法 — 继续深层比较
      不是:整个替换为新的虚拟节点

      function patch(oldVnode, newVnode) {
             
        // 比较是否为一个类型的节点
        if (sameVnode(oldVnode, newVnode)) {
             
          // 是:继续进行深层比较
          patchVnode(oldVnode, newVnode)
        } else {
             
          // 否
          const oldEl = oldVnode.el // 旧虚拟节点的真实DOM节点
          const parentEle = api.parentNode(oldEl) // 获取父节点
          createEle(newVnode) // 创建新虚拟节点对应的真实DOM节点
          if (parentEle !== null) {
             
            api.insertBefore(parentEle, vnode.el, api.nextSibling(oEl)) // 将新元素添加进父元素
            api.removeChild(parentEle, oldVnode.el)  // 移除以前的旧元素节点
            // 设置null,释放内存
            oldVnode = null
          }
        }
      
        return newVnode
      }
      
    • sameVnode方法 — 怎么判断是否为同一标签的虚拟节点?

      function sameVnode(oldVnode, newVnode) {
             
        return (
          oldVnode.key === newVnode.key && // key值是否一样
          oldVnode.tagName === newVnode.tagName && // 标签名是否一样
          oldVnode.isComment === newVnode.isComment && // 是否都为注释节点
          isDef(oldVnode.data) === isDef(newVnode.data) && 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值