虚拟DOM与diff算法

2023-09-21 13:20:21

虚拟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算法的比较如下图

      在这里插入图片描述

更多推荐

如何导出数据库数据字典

1、随便找一个工程项目,在项目build.gradle配置文件添加以下依赖compilegroup:'cn.smallbun.screw',name:'screw-core',version:'1.0.5'2、刷新下载依赖3、将以下代码拷贝到工程任意Java目录ScrewDemo.javapackagecom.xxx;

区块链的使用场景和优势

区块链技术是一种基于分布式数据库、密码学和去中心化结构的新型计算模式,其具有以下应用场景和优势:应用场景:1.数字货币:比特币、以太坊等数字货币系统能够实现去中心化、快速高效的支付功能。2.数字身份认证:基于区块链的数字身份认证系统可以提高身份认证的安全性,同时保护隐私。3.供应链管理:区块链技术可以实现对物流、采购、

为什么需要工业物联网 (IIoT)?如何实施?

制造业数字化、网络化、智能化已经是大势所趋。这些特性都在改变着制造业的格局,进而影响着我们生活和工作的方式。工业物联网作为一种利用传感器、云计算、大数据和人工智能等技术,实现了工业设备、流程和服务的智能化,正逐渐成为制造业的发展趋势。本文将进一步探讨工业物联网的特征、工业物联网带来的好处以及如何实施工业物联网。什么是工

陕西省中级工程师职称评审

一.评审范围全省范围具有合法生产,经营手续的中小企业局和非公有制经济从事工程师工作专业技术人员和高技能人员,均可申报当年达到法定退休或已办退休的人员,不大参加职称评审。评审专业领域;机械,材料,冶金,电气,电子,信息通信,仪器仪表,能源动力,控制工程,计算机,自动化,人工智能,广播电视,建设,土木,水利,测绘,化工,地

【Vue.js】快速入门与工作生命周期的使用

🎬艳艳耶✌️:个人主页🔥个人专栏:《Spring与Mybatis集成整合》《springMvc使用》⛺️生活的理想,为了不断更新自己!目录​编辑1.Vue是什么2.Vue的特点及优势3.使用Vue的详细步骤3.1.导入3.2.定义边界3.创建vue实例4.Vue的基本语法4.1v-model4.2v-bind:va

Linux深度学习问题汇总

解决Ubuntu中root账户下tab失效的问题在Ubuntu中,出于安全考虑,默认情况下root用户是被禁用的。当你使用sudo或sudosu成为root用户时,有时可能会发现某些方便的功能,例如tab键自动补全,不工作。这可能是由于几个原因:缺少bash-completion包:bash-completion是一个

【重新定义matlab强大系列十三】直方图 bin 计数和分 bin 散点图

🔗运行环境:Matlab🚩撰写作者:左手の明天🥇精选专栏:《python》🔥推荐专栏:《算法研究》####防伪水印——左手の明天####💗大家好🤗🤗🤗,我是左手の明天!好久不见💗💗今天开启新的系列——重新定义matlab强大系列💗📆最近更新:2023年09月17日,左手の明天的第290篇原创博客

中尺度混凝土二维有限元求解——运行弯曲、运行光盘、运行比较、运行半圆形(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码实现💥1概述中尺度混凝土二维有限元求解是一种常见的工程分析方法

CDH 集群离线部署、大数据组件安装与扩容详细步骤(cdh-6.3.1)

一、环境准备1、服务器配置和角色规划IP地址主机名硬件配置操作系统安装步骤10.168.168.1cm-server8C16GCentos7新建10.168.168.2agent018C16GCentos7新建10.168.168.3agent028C16GCentos7新建10.168.168.4agent038C1

MySQL数据同步&归档使用工具总结

数据迁移方式&工具总结kettel的使用dataX的使用pt-archiver的使用kettel的使用1、中文网:http://www.kettle.org.cn/2、下载地址3、使用kettle进行数据迁移3.1打开文件夹,运行spoon.bat3.2点击文件,新建转换3.3新建数据库连接,一个为源数据库,另一个为目

mysql 主从复制 mysql版本5.7.35

文章目录1.注意要点2.环境3.MySQL主从配置的步骤:主从库新增DB主服务配置my.cnf从服务配置my.cnf主服务器创建复制用户从服务器执行复制外传MySQL主从复制(Master-SlaveReplication)是一个常用的高可用性和可扩展性解决方案。通过主从复制,可以将一个MySQL数据库服务器(主服务器

热文推荐