Vue 中 diff 算法原理

news2025/1/11 20:00:26


一、Diff 概念

Vue 基于虚拟 DOM 做更新。diff 算法的核心就是比较两个虚拟节点的差异。

Vue 的 diff 算法是平级比较(如图,父级和父级比较,儿子和儿子比较,孙子和孙子比较),不考虑跨级比较的情况(因为在实际场景上极少用到,且为了性能考虑所以不考虑跨级比较的情况)。

内部采用深度递归的方式 + 双指针的方式进行比较。

二、Diff 比较流程

1、先比较两个虚拟节点是否是相同节点【key、tag】

主要是比较两个节点的 key 属性和 tag 标签,有任何一个不一样就说明这两个元素不是相同元素

2、如果是相同节点,下一步是比较属性并复用老节点 (将老的虚拟 DOM 复用给新的虚拟节点 DOM)

如果不一样,就会删除老节点,创建新节点 

3、如果两个父节点相同的话,那么就比较儿子节点,需要以下几种情况:

① 老的没儿子,新的有儿子。

那么就创造新的儿子节点,直接插入元素中

② 老的有儿子,新的没儿子。

直接删除老的儿子节点

③ 老的儿子是文本,新的儿子也是文本。

如果不一致,直接更新文本节点即可

④ 老的儿子是一个列表,新的儿子也是一个列表 updateChildren方法

两个列表的比较,也是diff算法的核心所在。一个数组跟另一个数组的比对,有差异就更新。

三、两个列表的比较:优化比较

常见DOM操作:追加、删除、倒序、反序

对应的优化比较策略:头头、尾尾、头尾、尾头

优化方案: 

整个优化采用双指针的方式,也就是在新老节点的头部和尾部分别插入2个指针,在头部和尾部都有一个指针。在比对的过程中,采用的是有一方头尾指针重合的话,就意味着节点遍历结束。这个时候就会终止 diff 算法。

① 头和头节点比较【头头】

首先,比较A和A是否相同,相同则指针向后移动。 B和B,C和C,这时候指针已经越界,diff 算法结束。将 D 直接插入到节点中就可以了。

向尾部插入新节点: 

   

替换尾部不相同的节点:

②  尾和尾节点比较【尾尾】

指针从尾部开始比较新老节点。

向头部插入新节点:

 

替换头部不相同的节点:

③  头和尾节点比较【头尾】

先比较头和头是否相同,再比较尾和尾是否相同。都不相同的时候,那就是用头部比较。 

将老节点的头部跟新节点的尾部比较,相同则将老节点移动到后面去。 

后面就是按照头头比较、尾尾比较、头尾比较这种顺序走。

 

④  尾和头节点比较【尾头】

先比较头和头是否相同,再比较尾和尾是否相同。都不相同的时候,那就是用头尾比较,再不相同就是尾头比较。

将老节点的尾部跟新节点的头部比较,相同则将老节点移动到前面去

头指针比对成功,头指针需要往后移动一格。尾指针比对成功,尾指针需要往前移动一格。

 

⑤ 倒序

 老规矩,递归的使用以下比对策略:先比较头头、尾尾,再比较头尾、尾头

固定一个节点,最后把每个节点进行移动来进行复用。并没有进行重新创建操作

 

        

5.比对查找进行复用

 乱序的情况下:

 


Vue3 中采用最长递增子序列来实现 diff 优化。

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

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

相关文章

企业专网?公网?工业4G路由器如何正确选择SIM卡?

选择合适的SIM卡对工业4G路由器稳定通信至关重要。但是面对企业专网和公网两种选择,用户该如何抉择呢?本文将全面解析专网卡与公网卡的区别、适用场景及选择要点,并推荐星创易联SR700等产品的匹配方案,助你正确选择最合理的工业SIM卡。 首先,从网络质量上,企业专网较公网更稳定…

韩语翻译器拍照翻译方法,几个步骤轻松翻译

韩语是一种非常有趣的语言,但对于大多数人来说,是非常难以掌握的。 如果你正在韩国旅行或生活,你可能会遇到许多韩语文字和标志,这时候拍照翻译就派上用场了。 许多智能手机都有支持翻译应用,但是如何在手机上拍照并翻…

Java版B/S架构 智慧工地源码,PC、移动、数据可视化智慧大屏端源码

智慧工地是什么?智慧工地主要围绕绿色施工、安全管控、劳务管理、智能管理、集成总控等方面,帮助工地解决运营、管理方面各个难点痛点。在互联网的加持下促进项目现场管理的创新与发展,实现工程管理人员与工程施工现场的整合,构建…

一网打尽java注解-克隆-面向对象设计原则-设计模式

文章目录 注解内置注解元注解 对象克隆为什么要克隆?如何克隆浅克隆深克隆 Java设计模式什么是设计模式?为什么要学习设计模式? 建模语言类接口类之间的关系依赖关系关联关系聚合关系组合关系继承关系实现关系 面向对象设计原则单一职责开闭原…

速通蓝桥杯嵌入式省一教程:(九)AT24C02芯片(E2PROM存储器)读写操作与I2C协议

AT24C02芯片(又叫E2PROM存储器、EEPROM存储器),是一种通过I2C(IIC)协议通信的掉电保存存储器芯片,其内部含有256个8位字节。在介绍这款芯片之前,我们先来粗略了解一下I2C协议。 I2C总线是一种双向二线制的同步串行总线…

BLFS学习系列 第26章. 显示管理器 —— 总述

显示管理器(Display Manager)是用于启动图形显示(当前为X服务器)并为窗口管理器或桌面环境提供登录功能的图形程序。 有许多显示管理器可用。一些较为知名的包括:GDM、KDM(已弃用)、LightDM、L…

ssm助学贷款系统源码和论文

ssm助学贷款系统源码和论文050 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳&am…

Java注解语法

Java注解语法 1. 前置基础 ​ 学习java反射语法 JAVA通过反射使用公共构造方法和私有构造方法来创建对象 2. Java注解是什么? ​ Java注解是代码中的特殊标记,比如Override、Test等,作用是:让其他程序根据注解 信息决定怎么执…

【ECCV2022】Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation

Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation 论文:https://arxiv.org/abs/2105.05537 代码:https://github.com/HuCaoFighting/Swin-Unet 解读:Swin-UNet:基于纯 Transformer 结构的语义分割网络 -…

【FAQ】视频云存储/安防监控EasyCVR视频汇聚平台如何通过角色权限自行分配功能模块?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、…

SpringMVC 写个 HelloWorld

文章目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式:warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求控制器5、创建springMVC…

Linux下彻底卸载jenkins

文章目录 1、停服务进程2、查找安装目录3、删掉相关目录4、确认已完全删除 1、停服务进程 查看jenkins服务是否在运行,如果在运行,停掉 ps -ef|grep jenkins kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 # 删掉相…

继承(C++)

继承 一、初识继承概念“登场”语法格式 继承方式九种继承方式组合小结(对九种组合解释) 二、继承的特性赋值转换 一一 切片 / 切割作用域 一一 隐藏 / 重定义 三、派生类的默认成员函数派生类的默认成员函数1. 构造函数2. 拷贝构造3. 赋值运算符重载4. …

部署FTP服务(二)

目录 2.访问FTP服务 1.使用ftp命令行工具 2.使用浏览器 3.使用FileZilla Client 3.Serv-U 1.定义新域 2.创建用户 4. windowsserver搭建ftp服务器 一、FTP工具 二、Windows资源管理器 三、IE浏览器访问 2.访问FTP服务 下面在一台装有Windows10操作系统的计算机中&#…

vue 简单实验 v-on html事件绑定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"event-handling"><p>{{ message }}</p><button v-on:click"reverseMessage">反转 Message</but…

医药市场调研--原始价值数据库分享<医药行业必读>

医药市场调研公司是专门从事医药行业市场调研的企业。它们的主要职责是收集、分析和解读与医药行业相关的市场数据和信息&#xff0c;为企业提供决策支持和战略指导。这些公司通过各种调研方法和工具&#xff0c;如市场调查、数据分析、定性研究等&#xff0c;帮助企业了解市场…

TCP的三次握手 四次挥手以及TCP的11种状态

三次握手流程&#xff1a; 客户端给服务端发送数据时&#xff0c;数据包中带有一个头&#xff0c;这个头就是前几十个字节&#xff0c;就是下面这张图。从源端口号&#xff0c;目的端口号&#xff0c;一直到序列号&#xff0c;直到Options。第一个包会将这前十几个字节中的SYN置…

【从零学习python 】72. 深入理解Socket通信及创建套接字的方法

文章目录 1. 不同电脑上的进程之间如何通信2. 什么是socket3. 创建socket进阶案例 1. 不同电脑上的进程之间如何通信 首要解决的问题是如何唯一标识一个进程&#xff0c;否则通信无从谈起&#xff01; 在1台电脑上可以通过进程号&#xff08;PID&#xff09;来唯一标识一个进程…

取模运算符在数组下标的应用

什么是取模运算符%&#xff1f; 定义&#xff1a; a mod b&#xff0c;设a、b属于正整数且b>0&#xff0c;如果q、r属于正整数满足aq*br&#xff0c;且0≤r<b&#xff0c;则定义&#xff1a; a mod b r 注意&#xff1a;取模运算符两侧的除数和被除数都是整数&#xff…

中秋节思维导图怎么绘制?教你使用这种绘制方法

中秋节思维导图怎么绘制&#xff1f;中秋节是中国传统的一个重要节日&#xff0c;许多人会在这一天与家人、朋友聚在一起庆祝&#xff0c;品尝月饼、猜灯谜、赏月等。中秋节作为一个具有浓厚文化底蕴的节日&#xff0c;其历史文化知识十分丰富&#xff0c;而通过绘制思维导图&a…