【前端必备】深入详解Vue2/Vue3 diff算法实现思路

在做diff算法之前有个基本逻辑要明白,Vuediff算法是同层比较,不会跨层比较,时间复杂度为O(N)。
在这里插入图片描述
主要使用首尾比较法(头-头,头-尾,尾-头,尾-尾)。Vue2与Vue3的diff算法主要区别是处理完首尾节点后,对剩余节点的处理方式。
在这里插入图片描述
在这里插入图片描述

Vu2简单diff算法

简单diff是基于递归来实现的,它适用于对比树形数据结构之间的差异

vue2.x就是使用的简单diff算法

实现思路是递归比较两个树的每个节点,如果两个节点相同,就比较它们的子节点,如果不同,就标记为删除或添加,并且停止递归

缺点的话就是只能比较树形数据结构,不能比较其他数据结构

Vue2 diff算法过程

新旧虚拟DOM分别创建首尾两个指针
依次头-头,头-尾,尾-头,尾-尾(startIndex1,startIndex2,endIndex1,endIndex2)比较,若在比较过程中发现指向的节点内容一致,则直接复用旧结点作为diff创建的节点。若这四种情况都不满足,则diff将创建当前新虚拟DOM的节点插入到diff队列后面,并且将新虚拟DOM的startIndex2指向下一个节点。
当其中一条虚拟DOM的endStart < startIndex,比较结束。
随后根据新老节点的数目,来进行插入或删除操作。若新节点数目大于老节点则需要把多出来的节点创建出来加入到真实 DOM中,反之若老节点数目大于新节点则需要把多出来的老节点从真实 DOM中删除。
至此整个 diff 过程就已经全部完成了。

Vue3双端diff算法

双端diff算法是简单diff算法的优化版本,是比较两个数组之间的差异,可以在不使用递归的情况下比较数组,从而提高效率。它可以处理更复杂的场景,比如移动了元素

vue3.x就是使用的双端diff算法

实现思路是从数组两端开始遍历,比较相邻元素是否相同,相同则比较下一对元素;如果不同,就标记为删除或添加,并继续遍历

缺点的话就只能比较序列类型数据结构,不能比较树形数据结构

Vue3 diff算法过程

  • 新旧节点从头开始比较,相同直接复用执行patch,直到比较到两节点不同为止。
  • 新旧节点从尾开始比较,相同直接复用执行patch,直到比较到两节点不同为止。
    处理完以上两种情况,剩下3种情况。
  • 老节点先遍历完,新节点还剩余:创建剩余新节点。
  • 新节点先遍历完,老节点还剩余:删除剩余旧节点。
  • 新老节点都有剩余:在新老剩余节点中寻找可复用节点。创建新节点剩余节点对应的映射表keyToNewIndexMap。再创建一个数组newIndexToOldIndexMap,用来存储新节点数组中的剩余节点在旧节点数组上的索引,后面将使用它计算出一个最长递增子序列,并初始化数组为0。
    在这里插入图片描述
  • 遍历老节点,存储新节点数组中的剩余节点在旧节点数组上的索引。
    在这里插入图片描述
  • 计算newIndexToOldIndexMap数组,得到最长增长子序列(贪心 + 二分)。
    -在这里插入图片描述
  • 遍历新节点,根据最长增长子序列进行移动、添加、删除节点。第一个节点为h,在newIndexToOldIndexMap中值为0,说明是新增的节点,创建。第二个节点为e,索引为3,与最长增长子序列中3命中,跳过。第三个节点为d,索引为2,与最长增长子序列中2命中,跳过
    第四个节点为c,索引为1,与最长增长子序列中1命中,跳过。第五个节点为f,索引为0,均不符合,进行hostInsert,将节点f的真实dom移动到节点nextChild节点c的前面。遍历结束完成 。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

查看自己电脑是arm还是x64(x86);linux操作系统识别

1、查看自己电脑是arm还是x64&#xff08;x86&#xff09; linux 参考&#xff1a; https://liuweiqing.blog.csdn.net/article/details/131783851 uname -a如果输出是 x86_64&#xff0c;那么你的系统是 64 位的 x86 架构&#xff08;通常我们称之为 x64&#xff09;。如果…

Java八大常用排序算法

1冒泡排序 对于冒泡排序相信我们都比较熟悉了&#xff0c;其核心思想就是相邻元素两两比较&#xff0c;把较大的元素放到后面&#xff0c;在一轮比较完成之后&#xff0c;最大的元素就位于最后一个位置了&#xff0c;就好像是气泡&#xff0c;慢慢的浮出了水面一样 Jave 实现 …

编曲是怎么编出来的 编曲软件哪个好用 编曲是干嘛的 编曲教学入门零基础 编曲制作 编曲和作曲什么区别 flstudio下载

编曲想必是许多音乐爱好者们的一大追求&#xff0c;能够自己编写出一首歌曲&#xff0c;代表着我们无论是从基本功还是创造力都达到了一定的水平。不过对于初学者来说&#xff0c;编曲还是比较复杂的&#xff0c;今天我们就来聊一聊编曲是怎么编出来的&#xff0c;编曲软件哪个…

「实用分享」用界面组件Telerik UI for Blazor增强你的财务图表!

Telerik UI for Blazor拥有110个原生的、易于定制的Blazor UI组件和高性能网格组件&#xff0c;能节约一半的时间开发全新的Blazor应用程序并使传统web项目现代化&#xff0c;其中囊括了设计和生成工具等。Telerik UI for Blazor控件提供的控件&#xff0c;可轻松满足应用程序对…

Cambalache in Ubuntu

文章目录 前言apt install flatpak这很ok快捷后记 前言 gtkmm4相比gtkmm3有很多改革, 代码也干净了许多, 但在windows上开发 有ui设计器那自然方便很多, 但glade又不支持gtkmm4, windows上装Cambalache很是困难. 各种问题都找不到答案.于是 我用VMware虚拟机Ubuntu20.xx安装Ca…

2024年高压电工证考试题库及高压电工试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年高压电工证考试题库及高压电工试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的高压…

从源代码看Chrome 版本号

一直以来都是用Chrome 浏览器&#xff0c;但是看到Chrome 点分4 组数据的表达方式&#xff0c;总是感觉怪怪的&#xff0c;遂深入源代码了解她的版本号具体表示的内容 chrome 浏览器中显示的版本号 源代码中的版本号标识 版本号文件位于 chrome/VERSION &#xff0c; 看到源代…

三种pdf转ppt方法?学会这几招轻松搞定转换

三种pdf转ppt方法&#xff1f;在当今的工作和生活中&#xff0c;PDF和PPT这两种文件格式常常会让我们感到困扰。有时候我们需要将PDF文件转换成PPT格式&#xff0c;以便更好地进行演示或工作汇报。但是&#xff0c;如何快速、准确地完成这项任务呢&#xff1f;本文将为你揭秘三…

【深入浅出Java性能调优】「底层技术原理体系」详细分析探索Java服务器性能监控Metrics框架的实现原理分析(Dropwizard度量基础案例指南)

深入探索Java服务器性能监控Metrics框架的实现原理分析 前提介绍Dropwizard MetricsDropwizard的特点Dropwizard的开发案例需要引入Maven依赖常用度量类型Meter(每秒请求数为单位测量请求率)定义度量核心MetricRegistry构建对应的Meter指标对象请求标记采样业务方法控制报告器…

计算机设计大赛 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…

时间复杂度为 O(n) 的排序算法

大家好&#xff0c;我是 方圆。本文介绍线性排序&#xff0c;即时间复杂度为 O(n) 的排序算法&#xff0c;包括桶排序&#xff0c;计数排序和基数排序&#xff0c;它们都不是基于比较的排序算法&#xff0c;大家重点关注一下这些算法的适用场景。 桶排序 桶排序是分治策略的一…

利用jmeter完成简单的压力测试

Jmeter是一个非常好用的压力测试工具。Jmeter用来做轻量级的压力测试&#xff0c;非常合适&#xff0c;只需要十几分钟&#xff0c;就能把压力测试需要的脚本写好。 1、什么是压力测试 顾名思义&#xff1a;压力测试&#xff0c;就是 被测试的系统&#xff0c;在一定的访问压…