Vue——Diff算法

目录

什么是Diff算法?

比较方式

1. 同层比较

2. 双端比较

双端比较的步骤:

3. 通过 key 来优化比较

原理分析

1. 虚拟 DOM 和真实 DOM

2. Diff 算法的基本原理

3. 双端比较优化

4. 通过 key 进行优化

5. 具体操作

6. 原理总结


声明,此博客中部分图示来自网络

什么是Diff算法?

        Vue 的 diff 算法是一种高效的比较新旧虚拟 DOM 树(Virtual DOM)并更新真实 DOM 的机制。它通过尽量减少对 DOM 的操作来提高性能。以下是 diff 算法的关键概念:

  1. 虚拟 DOM:Vue 使用虚拟 DOM 来表示 UI。虚拟 DOM 是一个轻量级的 JavaScript 对象树,表示真实 DOM 的结构和内容。当数据发生变化时,Vue 通过虚拟 DOM 比较新旧状态,找到变化的地方。

  2. 同层比较:Vue 的 diff 算法只会比较同一层级的节点,不会跨层比较。这意味着当父节点不同,Vue 不会去比较它们的子节点,而是直接销毁旧的节点并创建新的节点。

  3. 双端比较:Vue 采用了一种优化策略,即从新旧虚拟 DOM 的两端同时进行比较,这称为 "双端比较"。它从头部和尾部同时进行比较,直到发现不匹配的节点,从而减少遍历的次数。

  4. 复用节点:当 Vue 发现新旧虚拟 DOM 中的节点相同(通过 key 属性判断),它会复用已有的 DOM 节点,而不是销毁旧的节点重新创建。这进一步提高了性能。

  5. 更新策略:Vue 会根据 diff 结果,生成最小化的 DOM 更新操作,更新真实 DOM。这种基于 diff 的更新策略可以减少不必要的 DOM 操作,从而提升页面的渲染效率。

       Vue 的 diff 算法核心在于高效比较新旧虚拟 DOM 树的差异,并通过最小化 DOM 操作来更新 UI,提高渲染性能。


比较方式

1. 同层比较

        Vue 的 diff 算法只会在同一层级的节点中进行比较,而不会跨层进行比较。这样可以减少复杂度,因为不用递归遍历所有节点。它假设 DOM 结构的变化不会引发大的层级变动,主要会集中在同层次的节点变化上。

2. 双端比较

        双端比较是一种优化策略,即 Vue 会同时从两边进行比较:既从头部(左端)开始,也从尾部(右端)开始。通过这种方式,它能更快地找到不匹配的节点。

双端比较的步骤:
  • 头部对比:先从新旧虚拟 DOM 的头部开始比较节点,如果相同,则更新节点并继续比较下一个。
  • 尾部对比:如果头部节点不同,Vue 会同时检查新旧虚拟 DOM 的尾部,看看尾部的节点是否相同。如果相同,则继续向中间移动比较。
  • 头尾交叉对比:如果头尾都不匹配,Vue 会进一步尝试新 DOM 的头部与旧 DOM 的尾部,或者新 DOM 的尾部与旧 DOM 的头部进行交叉比较。
  • 中间节点处理:如果头尾对比都没有找到匹配的节点,那么 Vue 会进入中间部分的处理,通过节点的 key 属性来精确定位和比较节点。

3. 通过 key 来优化比较

        在 diff 算法中,Vue 强烈建议为列表渲染的节点设置 key 属性,key 可以帮助 Vue 更精确地比较节点。没有 key 时,Vue 只能通过节点的顺序来匹配节点,但如果使用了 key,它会根据 key 值来复用、移动或删除节点,从而提高性能和渲染的正确性。

  • 相同的 key:如果新旧节点的 key 相同,Vue 会复用这个节点,并更新其内容。
  • 不同的 key:如果新旧节点的 key 不同,则 Vue 会删除旧节点并创建新的节点。

原理分析

        Vue 的 diff 算法的原理是基于虚拟 DOM的差异检测机制。通过比较新旧两棵虚拟 DOM 树,找到变化的地方,并仅对这些差异进行最小化的 DOM 操作,从而提高渲染效率。下面是 Vue diff 算法的工作原理:

1. 虚拟 DOM 和真实 DOM

  • 虚拟 DOM:Vue 会先将页面的结构和内容生成一个虚拟 DOM(用 JavaScript 对象表示的树),当数据发生变化时,Vue 会根据新的数据生成新的虚拟 DOM。
  • 比较新旧虚拟 DOM:每次组件的状态发生变化时,Vue 会对比新旧两棵虚拟 DOM 树,找出发生变化的部分,这个过程就是 diff。

2. Diff 算法的基本原理

Vue 的 diff 算法遵循以下原则:

  • 同层比较:只比较同一层级的节点,不会跨层次进行比较,这可以大大减少复杂度。因为层级的改变通常不常见,Vue 假定层级结构在大多数情况下保持不变。

  • 最小化操作:diff 算法的目的是找到新旧 DOM 树的最小差异,进而生成最少的 DOM 操作。操作越少,性能越高,因为 DOM 操作相对比较昂贵。

  • 递归深度优先:diff 算法采用深度优先搜索的方式,从根节点开始,递归比较每个子节点,直到找到最小的差异。

3. 双端比较优化

Vue 的 diff 算法进行了一些优化,例如双端比较策略,它加快了节点查找速度:

  1. 头部比较:首先从新旧虚拟 DOM 的头部开始,逐一对比节点,如果相同就继续比较下一个节点。
  2. 尾部比较:如果头部没有匹配,就从尾部开始比较新旧 DOM。
  3. 头尾交叉比较:如果头尾都没有匹配,则 Vue 会检查新虚拟 DOM 的头部与旧虚拟 DOM 的尾部,或者新虚拟 DOM 的尾部与旧虚拟 DOM 的头部,寻找匹配的节点。

向中间靠拢 

通过从两边同时进行比较,Vue 可以更快速地找到不匹配的节点,并减少遍历的次数。

4. 通过 key 进行优化

  • key 的作用:在渲染列表(例如 v-for 渲染的列表)时,Vue 会建议开发者为每个列表项提供唯一的 key,这是为了帮助 Vue 更准确地跟踪每个节点的变化。没有 key 时,Vue 只能根据节点的位置去匹配,这可能导致不必要的节点更新。

  • key 的匹配规则:如果 key 相同,Vue 会认为这是同一个节点,并复用该节点。若 key 不同,则认为这是一个新节点,旧节点会被销毁,新节点会被创建。

5. 具体操作

        当 Vue 比较出新旧虚拟 DOM 的差异后,它会生成一个最小 DOM 更新操作集,Vue 只对比中发生变化的部分并更新这些变化,而不是重新渲染整个页面。具体包括以下几种情况:

  • 新增节点:如果新虚拟 DOM 中出现了旧虚拟 DOM 中不存在的节点,Vue 会在对应位置新增节点。
  • 删除节点:如果旧虚拟 DOM 中的节点在新虚拟 DOM 中不存在,Vue 会删除对应的真实 DOM 节点。
  • 更新节点:如果新旧虚拟 DOM 中的节点相同,但内容发生了变化(如文本、属性等),Vue 会更新这个节点的内容。

6. 原理总结

        Vue 的 diff 算法本质上是通过逐层对比新旧虚拟 DOM 树,识别出变化的节点,并生成最小化的 DOM 操作来更新页面。它通过双端比较和 key 优化,使得对比过程高效,并避免不必要的 DOM 操作。这种算法在保持良好的用户体验的同时,最大限度地减少了性能开销。


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

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

相关文章

AWS SES服务 Golang接入教程(排坑版)

因为刚来看的时候 也迷迷糊糊的 所以 先讲概念 再上代码 一 基础设置 这里需要完成两个最基础的设置任务 1 是验证至少一个收件电子邮箱 2 【很关键】是验证发送域。即身份里的域类型的身份。(可以理解为配置你的域名邮箱服务器(SMPT)为亚马…

Flink问题记录

尚硅谷Flink1.17问题记录 上手pom依赖循环递归WordCountStreamDemo中readTextFile是deprecated&#xff08;强烈反对的&#xff09;Flink本地模式开启WebUI 上手 pom依赖循环递归 pom依赖中&#xff1a; <dependency><groupId>org.apache.flink</groupId>&…

使用C++20协程实现异步I/O操作:实战指南

使用C20协程实现异步I/O操作&#xff1a;实战指南 随着C20的发布&#xff0c;协程&#xff08;coroutines&#xff09;作为一种新的语言特性被引入&#xff0c;为异步编程提供了强大的支持。协程使得编写异步代码变得更加简洁和直观&#xff0c;避免了传统回调和状态机的复杂性…

Spring MVC: 构建Web应用的强大框架

Spring MVC: 构建现代Web应用的强大框架 1. MVC设计模式简介 MVC (Model-View-Controller) 是一种广泛使用的软件设计模式,它将应用程序的逻辑分为三个相互关联的组件: Model (模型): 负责管理数据、业务逻辑和规则。View (视图): 负责用户界面的展示,将数据呈现给用户。Con…

关于Qt在子线程中使用通讯时发生无法接收数据的情况

在多线程应用中&#xff0c;串口通讯或TCP通讯的场景常常涉及到持续的读写操作&#xff0c;如果子线程处理不当&#xff0c;可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例&#xff0c;详细解释如何在多线程环境中避免信号阻塞&#xff0c;并提供代码示例。 1. 问题…

前端开发中遇到的小问题以及解决方案记录2

1、H5中适配屏幕的工具-postcss-px-to-viewport postcss-px-to-viewport。因为设计稿一般给的都是375px宽度的&#xff0c;所以假如一个字体是16px&#xff0c;那么在开发中不能直接写死为16px&#xff0c;因为各个厂商的手机屏幕大小是不同的&#xff0c;所以要根据屏幕大小去…

【人工智能学习笔记】1_人工智能基础

本系列是个人学习《阿里云人工智能工程师ACA认证免费课程&#xff08;2023版&#xff09;》的笔记&#xff0c;仅为个人学习记录&#xff0c;欢迎交流&#xff0c;感谢批评指正 人工智能概述 智能的三大能力&#xff1a;感知、记忆与思维、学习与适应能力人工智能的定义 明斯基…

正规表达式例题

解析&#xff1a;从题意可知&#xff0c;a可以有零个或多个&#xff0c;b有1个或多个 选项A&#xff1a;这里a至少有1个&#xff0c;不符合题意 选项B&#xff1a;a^*bb^*&#xff0c;a是0个或多个&#xff0c;b可以是1个或多个&#xff0c;符合题意 选项C和选项D&#xff0…

Camunda调用子流程案例

调用子流程 调用子流程是指子流程在主流程的外面。子流程一般是多个流程可重用的流程&#xff0c;也可以独立调用子流程。 可以对比编程中的方法抽取。子流程运行时&#xff0c;主流程也是等待状态。子流程结束&#xff0c;主流程继续。 立即体验&#xff0c;请访问JeecgFlow …

AWTK HTML View 控件更新

AWTK HTML View 控件基于 Lite HTML 实现&#xff0c;从最初的版本开始&#xff0c;3 年多过去了&#xff0c;Lite HTML 做了大量的更新&#xff0c;最近抽空将 AWTK HTML View 控件适配到最新版本的 Lite HTML&#xff0c;欢迎大家使用。 AWTK HTML View 控件。HTML View 控件…

Android 开发避坑经验第三篇:RecyclerView 高效使用与常见问题解决

RecyclerView 是 Android 应用开发中最常用的 UI 组件之一,通常用于显示大量数据列表。尽管功能强大,但如果使用不当,会导致性能问题、数据错乱或滚动卡顿等问题。在本篇文章中,我们将探讨 RecyclerView 的一些常见坑点,提供解决方案,并附带代码示例。 1. 坑点:ViewHol…

LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现N*K时间复杂度

3177. 求出最长好子序列 II 题目链接 题目描述 给你一个整数数组 nums 和一个非负整数k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标i满足 seq[i] ! seq[i 1] &#xff0c;那么我们称这个整数序列为好序列。请你返回 nums中好子序列的…

玩转Python Turtle库,实现满屏飘字的魔法!

前言 本文将教你如何使用Python的Turtle库&#xff0c;通过简单的编程实现满屏飘字的炫酷效果。无需复杂的编程知识&#xff0c;跟着我们的步骤&#xff0c;你也可以成为编程小达人&#xff01; 效果展示 开发过程 一、准备工作 首先&#xff0c;确保你的电脑上已经安装了Py…

12. GIS地图制图工程师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

python如何读取excel文件内的数据

目录 前言一、安装openpyxl二、读取Excel数据总结前言 在Python中读取Excel数据,最常用的库之一是openpyxl(用于.xlsx格式)和xlrd(尽管xlrd从版本2.0开始不再支持.xlsx,仅支持旧的.xls格式)。然而,对于大多数现代应用来说,openpyxl是一个更好的选择,因为它支持.xlsx格…

2. GIS数据工程师岗位职责、技术要求和常见面试题

本系列文章目录&#xff1a; 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…

基础学习之——Docker 的基本概念和优势,以及在应用程序开发中的实际应用。

Docker是一种开源的容器化平台&#xff0c;可以将应用程序及其所有依赖项打包在一个容器中&#xff0c;实现跨平台、可移植和可扩展的部署。下面是Docker的基本概念和优势&#xff1a; 容器&#xff1a;Docker使用容器来打包应用程序及其依赖项&#xff0c;容器是一个独立、可执…

COD论文笔记 BiRefNet

本质还是一个 U 型编码器解码器结构的分割模型。 我可以考虑将©和(d)结合&#xff0c;即对解码器的输入不进行 patchify,同时在各个阶段引入梯度参考信息 最近的相关工作&#xff0c;中间监督、额外先验(频率&#xff0c;梯度&#xff0c;边缘等)取得不错效果 作者观察到…

Post-Training有多重要?一文带你了解全部细节

1. 简介 随着LLM学界和工业界日新月异的发展&#xff0c;不仅预训练所用的算力和数据正在疯狂内卷&#xff0c;后训练&#xff08;post-training&#xff09;的对齐和微调方法也在不断更新。InstructGPT、WebGPT等较早发布的模型使用标准RLHF方法&#xff0c;其中的数据管理风…

[建模已更新]2024数学建模国赛高教社杯A题:“板凳龙” 闹元宵 思路代码文章助攻手把手保姆级

本系列专栏将包括两大块内容 第一块赛前真题和模型教学,包括至少8次真题实战教学,每期教学专栏的最底部会提供完整的资料百度网盘包括:真题、数据、可复现代码以及文章. 第二块包括赛中详细思路建模、代码的参考助攻, 会提供2024年高教社国赛A的全套参考内容(一般36h内更新完毕…