diff 算法 和 虚拟 DOM

一:虚拟DOM

虚拟DOM 它是虚拟的,只在概念里面存在。比如一段vue 代码

    <template>
      <div id='wrapper'>
        <p><span>111</span></p>
        <h4>333</h4>
        <div class='content'>222</div>
      </div>
    </template> 
// 用js表示DOM树
    // children: 用数组表示 子节点
    // props: 属性
    // dom: 节点类型
    var vNode = {
      dom: 'div',
      props: {
        id: 'wrapper'
      },
      children: [{
        dom: 'p',
        children: [{
          dom: 'span'
        }]
      },{
        dom: 'h4'
      },{
        dom: 'div',
        props: {
          class: 'content'
        }
      }]
    }

diff 算法工作流程

function patchNode(oldNode, vNode) {
      // 先拿出真实DOM
      const el = oldNode.el = vNode.el
      // 分别拿出老节点的子元素 新节点的子元素
      let oldCh = oldNode.children
      let newCh = vNode.children
      // 如果新老节点相同,则不进行任何操作
      if (oldCh === newCh)  return
      // 分情况操作 
      // 1. 只有文字节点
      // 2. 删除子元素
      // 3. 增加子元素
      // 4. 改变子元素
      const textCheck = (oldCh.textNode !== null) && (newCh.textNode !== null) && (oldCh.textNode !== newCh.textNode)
      if (textCheck) {
        api.setextContent(el, vode.text) // 文字节点更新 api
      } else {
        // 如果心老节点都存在子元素 并且不相等 说明子元素变动
        if(oldCh && newCh && newCh !== oldCh) {
          updateChildren()
        } else if (oldCh) {
          // 只有老节点存在子元素,说明删除
          api.removeChild(el)
        } else if (newCh) {
          // 只有新节点存在子元素 说明增加
          createEl(newCh)
        }
      }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值