vue2 vue3 diff算法比较

目录

1:没key

补充1:为什么不建议用index作为key值?

2:有key

2.1:vue2diff

2.2:vue3diff

补充2:vue3的最长递增子序列

补充3:vue2diff和vue3diff的比较

补充4:虚拟dom

补充5:vue3diff源码解析(不是我写的,我感觉别个写的很好,直接看)

暂时先写这么多,如有错误,欢迎指正!


1:没key

没有key值,Vue会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。

例如:现在有abcd四个节点,需要在bc节点间添加一个e节点,没有key值时,会将c节点变成e节点,d节点变成c节点,最后加入d节点(如下图一)。有key值时,直接在bc之间加入e节点(如下图二)。key值的作用,简单来说就是给节点加一个唯一标识,让diff算法可以识别这个节点,只更新对应的dom而不是全部更新。

图一
图二
补充1:为什么不建议用index作为key值?

因为index不稳定,比如数组中间添加一个值,它后面的元素index值就全部变了,后面dom需全部更新,性能并没有优化。

2:有key

2.1:vue2diff

简单来说,就是先老节点与新节点,头对头->尾对尾->头对尾->尾对头,再不行就从根据新节点key值,找对应的老节点,找到更新对应的真实dom.以上五步是不符合条件依次往下,符合条件,新老节点的startIndex或endIndex会向中间靠拢,进行下一节点的对比。

以下分五种情况讲解:

  1. “理想状态”,没变(如下图三):依次复用dom,oldStart和newStart向后移动,直至完成。
    图三
  2. “头对不上头”,(如下图四):头跟头比,对不上,尾巴对上了,从尾巴开始复用dom,oldEnd和newEnd向前移动,直至完成,多的删掉。
    图四
  3. “头对不上头,尾也对不上尾”,(如下图五):头跟头没对上,尾跟尾也没对上,接下来就开始交叉对比了,首先是老的节点头跟新的节点尾对比,对上了就更新dom,对应的新旧节点头尾指针变化。(这里用红色表示对不上,没有更新dom ,蓝绿色表示对上了,有更新dom)
    图五
  4. “头对不上尾”,(如下图六):除了头对不上头,尾对不上尾,头也对不上尾了,那就尾对头,对上了就渲染dom。(这里第一个头尾是老节点的,第二个头尾是新节点的)
    图六
  5. “完全乱序”,(如下图七):头对不上头,尾对不上尾,头尾交叉也对不上,那就根据key值来找,newStart的key,按顺序从老节点中找到key值对应的节点,从oldStart开始哈,找到后渲染出来,就继续头对头,,,比下去。
    图七

以上就是vue2diff的完整解析了,这里不贴源码了~

2.2:vue3diff

以下分两种情况简单讲解:

  1. “头对上头,或者尾对上尾:如vue2diff的前两种情况,这里不做过多讲解。
  2. ”头对不上头,尾也对不上尾“,如图八系列):这里老节点与新节点依次对比,找到了打个位置标记,当全部老节点判断完成后,借助最长递增子序列和前面的位置标记(书面语新旧节点位置映射表),再进行dom节点的复用与渲染。
    图八
  • 先确定头对不上头,尾对不上尾,以上是无序多个节点
  • 列出新旧节点映射表,这里是为了区分是否新增节点,默认是0,这一步同时删掉需要删除的节点。
  • 找出最长递增子序列,这里是为了做最少的改动。
  • 渲染。如上图例子,我们从newEnd开始看,新旧节点映射表如图,可以知道f是新增节点,直接渲染。根据bdac来找最长递增子序列,是ac,ac位置不变,db位置移动。
补充2:vue3的最长递增子序列

vue3寻找最长递增子序列同时用了二分查找和贪心算法,这里不详细讲了。

补充3:vue2diff和vue3diff的比较

1:vue2diff是基于递归的双指针,vue3diff是基于数组的动态规划。

2:vue2全部比较,vue3不比较静态节点。

3:vue2的diff完全乱序的列表需要借助key,性能会好一些,vue3是借助位置变化值。(注意:有听到一个说法,vue3diff不需要key值,单看核心diff好像是哦,但是假设应对完全乱序的列表,没有key的话,vue3的做法和vue2是一样的吧~参考1)

补充4:虚拟dom

虚拟 DOM (Virtual DOM,简称 VDOM) 是一种编程概念,意为将目标所需的 UI 通过数据结构“虚拟”地表示出来,保存在内存中,然后将真实的 DOM 与之保持同步。官方文档给的例子如下:

const vnode = {
  type: 'div',
  key:null,
  props: {
    id: 'hello'
  },
  children: [
    /* 更多 vnode */
  ]
}

<div id="hello">
//...
</div>
补充5:vue3diff源码解析(不是我写的,我感觉别个写的很好,直接看)

vue3diff源码解析

暂时先写这么多,如有错误,欢迎指正!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 服务升级:MySQL 主从(半同步复制) 平滑升级

目录 一、实验 1.环境 2.Mysql-shell 检查工具兼容性 3.逻辑备份MySQL数据 4.备份MySQL 数据目录、安装目录、配置文件 5.MySQL 升级 6.master节点 使用systemd管理mysql8 7. slave1 节点升级 8. slave2 节点升级 9.半同步设置 二、问题 1.mysqldump备份报错 2.Inn…

推荐一个Java学习路线图

今天给大家推荐一个Java 学习路线, Java 要学的知识点、对应的学习资源和预计要花费的时间&#xff0c;都安排的明明白白的&#xff0c;不用再盲目的选了&#xff0c;有计划了&#xff0c;也别再迷茫和纠结了&#xff0c;就跟着学就行了。 1.1阶段一练气筑基--Java基础&#xf…

分布式砖题

雪花算法 变动位数&#xff0c;性能佳&#xff0c;灵活调整bit位划分&#xff0c;灵活 zk 临时节点和watch机制实现注册中心 &#xff0c;数据都在内存&#xff0c;nio 多线程模型&#xff1b; cp注重一致性&#xff0c;集群数据不一致时集群不可用 数据一致性模型 cap 强…

Nanya(南亚科技)DRAM芯片选型详解

一、DRAM产品选型 普通SDRAM只在时钟的上升期进行数据传输&#xff0c;DDR内存能够在时钟的上升期和下降期各传输一次数据&#xff0c;因此性能翻倍&#xff0c;被称为双倍速率同步动态随机存储器。因此DDR内存可以在与SDRAM相同的总线频率下达到更高的数据传输率。DDR是一种掉…

十一、MYSQL 基于MHA的高可用集群

目录 一、MHA概述 1、简介 2、MHA 特点 3、MHA 工作原理&#xff08;流程&#xff09; 二、MHA高可用结构部署 1、环境准备 2、安装MHA 监控manager 3、在manager管理机器上配置管理节点&#xff1a; 4、编master_ip_failover脚本写 5、在master上创建mha这个用户来访…

32位ARM微控制器: TLE9877QTW40XUMA1、CY9BF416NPMC-G-JNE2、CY9BF316NPMC-G-JNE2描述、器件参数

1、TLE9877QTW40 IC MCU 32BIT 64KB FLASH 48TQFP 描述&#xff1a;TLE9877QTW40属于TLE987x产品系列。TLE9877QTW40是一款单芯片三相电机驱动器&#xff0c;集成了行业标准的Arm Cortex -M3内核&#xff0c;能够实现先进的电机控制算法&#xff0c;例如磁场定向控制。它包括六…

【SpringSecurity】十三、基于Session实现授权认证

文章目录 1、基于session的认证2、Demosession实现认证session实现授权 1、基于session的认证 流程&#xff1a; 用户认证成功后&#xff0c;服务端生成用户数据保存在session中服务端返回给客户端session id (sid&#xff09;&#xff0c;被客户端存到自己的cookie中客户端下…

进阶了解C++(5)——搜索二叉树

1. 什么是搜索二叉树&#xff1a; 在之前针对数据结构的文章中&#xff0c;对数、二叉树以及堆进行了介绍&#xff0c;在本部分&#xff0c;将针对二叉搜索树进行介绍。对于二叉搜索树&#xff0c;其于二叉树相比&#xff0c;最大的特点就是结点的排布是存在规则的。在搜索二叉…

seleniumUI自动化实例(登录CSDN页面)

今天分享一个CSDN登录模块的登录场景 1.配置文件 CSDNconf.py&#xff1a; from selenium import webdriver options webdriver.ChromeOptions() options.binary_location r"D:\Program Files\360\360se6\Application\360se.exe" # 360浏览器安装地址 driver w…

Spark 3.5.0 特性速览

介绍 Spark 3系列已经发布了第六版3.5.0&#xff0c;目前最新3.5.1。 使用最广泛的大数据可扩展计算引擎。数以千计的公司&#xff0c;包括 80% 的财富 500 强企业&#xff0c;都在使用 Apache Spark。来自业界和学术界的 2000 多名开源项目贡献者。 Apache Spark 3.5.0 是…

单片机——数电复习(1)

1逻辑门电路的分类 2高电平与低电平的含义 1逻辑门电路的分类 1.1按了逻辑功能分 与门 或门 非门 异或门 与非门 或非门 与或非门 与门&#xff08;全1为1&#xff09;YAB 全为高电平才输出高电平 使用仿真看现象 当只有一个输入只有一个为1时小灯不亮 当输入都为1时 &a…

【RabbitMQ | 第四篇】基于RabbitMQ实现延迟队列

文章目录 4.基于RabbitMQ实现延迟队列4.1延迟队列定义4.2基于DLX&#xff08;死信交换机&#xff09;实现延迟队列4.2.1实现思路4.2.2主要流程4.2.3实战&#xff08;1&#xff09;创建两个消息队列&#xff1a;原始消息队列、死信队列 and 为原始消息队列关联私信交换机&#x…

搜维尔科技:OptiTrack提供了一个通用、精确、灵活和可监控的系统!

MELS集成OptiTrack与最前沿的虚拟生产阶段 在加拿大蒙特利尔&#xff0c;MELS Studios and Postproduction设有20个工作室&#xff0c;以满足各种规模的电影和电视项目的需求。凭借先进的技术设施和专业的技术团队&#xff0c;梅尔斯为电影行业的合作伙伴提供从摄影棚和设备租…

Python分析无人驾驶汽车在桂林市文旅行业推广的问卷

【项目背景】 通过市场调研、文本分析、访谈和问卷调查等方法&#xff0c;探讨&#xff1a; 网民对无人驾驶汽车出行服务的态度。无人驾驶安全员的行业背景。不同人群在旅游时的交通选择偏好。游客及当地居民对桂林市文旅路线的交通满意度。乘客对无人驾驶汽车的满意度。桂林…

策略模式实战

项目推荐最近开发完成的项目中使用到了策略模式&#xff0c;实现多种支付方式&#xff0c;避免了后期支付方式if-else代码的冗余&#xff0c;也有利于后期支付的一个扩展。同时这个项目非常适合于做毕设&#xff0c;想了解这个项目的同学可以联系我QQ&#xff1a;3808898981 前…

【项目管理后台】Vue3+Ts+Sass实战框架搭建一

项目管理后台 建立项目最好是卸载Vetur 新建.env.d.ts文件安装Eslint安装校验忽略文件添加运行脚本 安装prettier新建.prettierrc.json添加规则新建.prettierignore忽略文件 安装配置stylelint新建.stylelintrc.cjs 添加后的运行脚本配置husky配置commitlint配置husky 强制使用…

【十三】【算法分析与设计】二分查找(1)

704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], target 9 输出: 4…

HarmonyOS NEXT应用开发之元素超出List区域

介绍 本示例介绍在List组件内实现子组件超出容器边缘的布局样式的实现方法。 List组件clip属性默认为true&#xff0c;超出容器边缘的子组件会按照List的布局范围被裁剪。为此&#xff0c;可以在List组件内部添加一个占位的ListItem&#xff0c;以达到预期的布局效果。List占…

机器学习-05-特征工程

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中特征工程部分。 参考 机器学习之特征工程详解 特征工程&#xff08;Feature Engineering&#xff09; 特征工程是指使用专业的背景知识和技巧处理数据&#xff0c;使得特征能在机器学习算法上发生更好的…

弹幕视频网站|基于JSP技术+ Mysql+Java+ Tomcat的弹幕视频网站设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…
最新文章