虚拟DOM与diff算法

虚拟DOM与diff算法

snabbdom

  • 是什么:snabbdom是著名的虚拟DOM库,是diff算法的鼻祖,Vue源码借鉴了snabbdom

虚拟DOM

  • 是什么:本质上是存在内存里的 JavaScript 对象

  • 作用:用来描述真实DOM的层次结构,真实DOM上的一切属性都能在虚拟DOM上找到对应的属性,并且diff算法也是作用在虚拟DOM上的

  • 怎么用(如何产生):用h函数可以生成虚拟DOM

    // 调用h函数
    h('p', {}, 'aaa');
    // 得到以下的虚拟DOM
    { "sel": "p", "data": {}, "text": "aaa" }
    // 真实DOM如下
    <p>aaa</p>
    
    • h函数代码如下

      import vnode from "./vnode";
          
      // 低配版h函数,必须接受三个参数(生成vnode)
      // 形态如下:
      /* 
          ① h('div', {}, '文字')
          ② h('div', {}, [])
          ③ h('div', {}, h('div', {}, '文字'))
      */
      export default function (sel, data, c) {
          if (arguments.length !== 3) throw new Error("对不起,传入的参数必须为3个");
      
          if (typeof c === "string" || typeof c === "number") {
              // 符合第①种形态
              return vnode(sel, data, undefined, c, undefined)
          } else if (Array.isArray(c)) {
              // 符合第②种形态
              let children = [];
              for (let index = 0; index < c.length; index++) {
                  const element = c[index];
                  // 如果不是h()
                  if (
                      !(typeof element === "object" && element.hasOwnProperty("sel"))
                      ) {
                      throw new Error("对不起,传入的参数有误");
                  }
                  children.push(element);
              }
      
              return vnode(sel, data, children, undefined, undefined);
          } else if (typeof c === "object" && c.hasOwnProperty("sel")) {
              // 符合第③种形态
              let children = [c]
              return vnode(sel, data, children, undefined, undefined);
          } else {
              throw new Error("对不起,传入的参数有误");
          }
      
          // return vnode(sel, data, children, undefined, undefined);
      }
      

diff算法

  • 是什么:一种作用于虚拟DOM上的算法

  • 作用:通过在虚拟DOM上进行精细化比较,从而达到最小量更新真实DOM的效果

  • diff算法是怎么做的

    • diff算法只在同一层进行比较,不同层的话会直接暴力删除旧的,插入新的

    • diff算法对同一个虚拟节点进行精细化比较,也就是选择器和key相同的虚拟节点。

    • diff算法的比较如下图

      在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值