虚拟DOM与diff算法

news2024/11/25 6:57:46

虚拟DOM与diff算法

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

      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DA2--获取网站用户数据集的大小

目录 1.题目描述 2.输入描述 3.输出描述 4.题目分析 5.通过代码 1.题目描述 现有一个Nowcoder.csv文件&#xff0c;它记录了牛客网的部分用户数据&#xff0c;包含如下字段&#xff08;字段与字段之间以逗号间隔&#xff09;&#xff1a; Nowcoder_ID&#xff1a;用户ID…

Vue 使用vue-cli构建SPA项目(超详细)

目录 一、什么是vue-cli 二&#xff0c;构建SPA项目 三、 运行SPA项目 前言&#xff1a; 在我们搭建SPA项目时候&#xff0c;我们必须去检查我们是否搭建好NodeJS环境 cmd窗口输入以下指令&#xff1a;去检查 node -v npm -v 一、什么是vue-cli Vue CLI&#xff08;Vu…

【智能电表数据接入物联网平台实践】

智能电表数据接入物联网平台实践 设备接线准备设备调试代码实现Modbus TCP Client 读取电表数据读取寄存器数据转成32bit Float格式然后使用modbusTCP Client 读取数据 使用mqtt协议接入物联网平台最终代码实现 设备接线准备 设备调试 代码实现 Modbus TCP Client 读取电表数…

抄写Linux源码(Day12:从 MBR 到 C main 函数 (1) )

回忆我们需要做的事情&#xff1a; 为了支持 shell 程序的执行&#xff0c;我们需要提供&#xff1a; 1.缺页中断(不理解为什么要这个东西&#xff0c;只是闪客说需要&#xff0c;后边再说) 2.硬盘驱动、文件系统 (shell程序一开始是存放在磁盘里的&#xff0c;所以需要这两个东…

极客时间:数据结构与算法之美【文章笔记 实践 总结】

原文链接:https://time.geekbang.org/column/intro/100017301 27 | 递归树&#xff1a;如何借助树来求解递归算法的时间复杂度&#xff1f;如何借助树来分析归并排序算法的时间复杂度&#xff1f;如何借助树来分析快速排序算法的时间复杂度&#xff1f;如何借助递归树来分析斐波…

macos (M2芯片)搭建flutter环境

安装的版本3.13.4、电脑上没有安装过android studio、安装过brew 1.在终端运行sudo softwareupdate --install-rosetta --agree-to-license&#xff0c;下图展示安装成功的效果 2.下载以下安装包来获取最新的 stable Flutter SDK 3.解压&#xff0c;⚠️注意下载安装sdk的包名…

沉积物微体古生物鉴定

声明 本文是学习GB-T 42629.4-2023 国际海底区域和公海环境调查规程 第4部分&#xff1a;海洋沉积物物理特性调查. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了国际海底区域和公海环境调查中的沉积物组成、物理力学性质、生物…

第二章 进程与线程 十三、进程互斥的软件实现方法(单标志法、双标志先检查、双标志后检查、Peterson算法)

目录 一、单标志法 1、算法思想 2、具体逻辑 二、双标志先检查 1、算法思想 2、具体逻辑 三、双标志后检查 1、算法思想 2、具体逻辑 四、Peterson算法 1、算法思想 2、具体逻辑 五、总结 一、单标志法 1、算法思想 两个进程在访问完临界区后会把使用临界区的权限…

as-if-serial与happens-before原则详解

文章目录 前言详解解决多线程下的问题 Happens-before原则总结as-if-serial语义happens-before的例子 前言 "as-if-serial"原则是Java内存模型中的一个重要概念。该规则规定&#xff1a;不管怎么重排序&#xff08;编译期间的重排序&#xff0c;指令级并行的重排序&…

MYSQL存储引擎基础知识介绍

下面重点介绍几种常用的存储引擎,并对比各个存储引擎之间的区别&#xff0c;以帮助读者理解 不同存储引擎的使用方式。 MyISAM MyISAM是 MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键&#xff0c;其优势是访 问的速度快&#xff0c;对事务完整性没有要求或者以 SEL…

怒刷LeetCode的第11天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;迭代 方法二&#xff1a;递归 方法三&#xff1a;指针转向 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;快慢指针 方法二&#xff1a;Arrays类的sort方法 方法三&#xff1a;计数器 方法四…

【Java 基础篇】Java线程组详解

Java线程组是一种用于管理线程的机制&#xff0c;它允许你将线程组化为一个单元&#xff0c;并对组内的线程进行一些操作和控制。本文将详细介绍Java线程组的概念、如何创建和管理线程组&#xff0c;以及线程组的一些常见用法。 什么是线程组&#xff1f; 线程组是一个用于组…

python生成PDF报告

前言 最近接到了一个需求-将项目下的样本信息汇总并以PDF的形式展示出来&#xff0c;第一次接到这种PDF的操作的功能&#xff0c;还是有点慌的&#xff0c;还好找到了reportlab这个包&#xff0c;可以定制化向PDF写内容&#xff01; 让我们由简入深进行讲解 一、reportlab是…

2023年腾讯云轻量服务器测评:16核 32G 28M 配置CPU测试

腾讯云轻量应用服务器16核32G28M配置优惠价3468元15个月&#xff08;支持免费续3个月/送同配置3个月&#xff09;&#xff0c;轻量应用服务器具有100%CPU性能&#xff0c;系统盘为380GB SSD盘&#xff0c;28M带宽下载速度3584KB/秒&#xff0c;月流量6000GB&#xff0c;折合每天…

由于找不到d3dx9_43.dll,无法继续执行代码要怎么解决

D3DX9_43.dll是一个动态链接库文件&#xff0c;它是DirectX的一个组件&#xff0c;主要用于支持一些旧版本的游戏和软件。当电脑缺少这个文件时&#xff0c;可能会导致这些游戏和软件无法正常运行。例如&#xff0c;一些老游戏可能需要D3DX9_43.dll来支持图形渲染等功能。此外&…

二分类问题的解决利器:逻辑回归算法详解(一)

文章目录 &#x1f34b;引言&#x1f34b;逻辑回归的原理&#x1f34b;逻辑回归的应用场景&#x1f34b;逻辑回归的实现 &#x1f34b;引言 逻辑回归是机器学习领域中一种重要的分类算法&#xff0c;它常用于解决二分类问题。无论是垃圾邮件过滤、疾病诊断还是客户流失预测&…

git安装配置教程

目录 git安装配置1. 安装git2. git 配置3.生成ssh key:4. 获取生产的密钥3. gitee或者github添加ssh-key4.git使用5. git 使用-本地仓库与远程仓库建立连接第一步&#xff1a;进入项目文件夹&#xff0c;初始化本地仓库第二步&#xff1a;建立远程仓库。 建立远程连接的小技巧 …

strcpy常见的错误

char* arr "handsome"; strcpy(arr, "pretty"); printf("%s\n", arr); 这个程序在编译器上是运行不出来的&#xff0c;因为arr是一个字符串指针&#xff0c;它的值不可以被修改&#xff0c;可以将arr改成字符数组

录屏没有声音怎么办,3个方法教你解决

随着科技的不断发展&#xff0c;人们越来越依赖电子设备进行工作和学习。在这个过程中&#xff0c;录屏已经成为了一种必要的技能。无论是手机还是电脑&#xff0c;我们都可以通过录屏来记录重要的信息。但是&#xff0c;有时候我们在录屏时会发现声音无法正常录制&#xff0c;…

前后端分离的低代码快速开发框架

低代码开发正逐渐成为企业创新的关键工具。通过提高开发效率、降低成本、增强灵活性以及满足不同用户需求&#xff0c;低代码开发使企业能够快速响应市场需求&#xff0c;提供创新解决方案。选择合适的低代码平台&#xff0c;小成本组建一个专属于你的应用。 项目简介 这是一个…