热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

Vuediff算法

Vuediff算法-一、diff算法diff算法是一种通过同层的树节点进行比较的高效算法,避免对树的逐层遍历,减少时间复杂度。diff算法的两个特点:只会同级比较,不会跨层

一、diff 算法

diff 算法是一种通过同层的树节点进行比较的高效算法,避免对树的逐层遍历,减少时间复杂度。

diff 算法的两个特点:

  • 只会同级比较,不会跨层。
  • diff 比较循环都是从两边往中间收拢。

二、Vue diff 算法

Vue的虚拟 dom diff 核心在于 patch 过程

2.1 首先将新旧 vNode 进行开始位置和结束位置的标记

let oldStartIndex = 0;
let oldEndIndex = oldChildren.length - 1;
let oldStartVnode = oldChildren[0];
let oldEndVnode = oldChildren[oldEndIndex];
let newStartIndex = 0;
let newEndIndex = newChildren.length - 1;
let newStartVnode = newChildren[0];
let newEndVnode = newChildren[newEndIndex];

2.2 标记好节点位置,进行循环处理节点

  • 如果当前 oldStartVnode 和 newStartVnode 节点相同,直接用新节点复用老节点,进行 patchVnode 复用,更新 oldStartVnode、newStartVnode、oldStartIndex++、newStartIndex++。
  • 如果当前 oldEndVnode 和 newEndVnode 节点相同,直接用新节点复用老节点,进行 patchVnode 复用,更新 oldEndVnode、newEndVnode、oldEndIndex--、newEndIndex--。
  • 如果当前 oldStartVnode 和 newEndVnode 节点相同,直接用新节点复用老节点,进行 patchVnode 复用,将老节点移动到 oldEndVnode 节点之后,更新 oldStartVnode、newEndVnode、oldStartIndex++、newEndIndex--。
  • 如果当前 oldEndVnode 和 newStartVnode 节点相同,直接用新节点复用老节点,进行 patchVnode 复用,将老节点移动到 oldStartVnode之前,更新 oldStartVnode、newEndVnode、oldEndIndex--、newStartIndex--。
  • 如果都不满足则没有相同节点复用,进行 key 的对比,满足条件进行 patchVnode 过程,并将 dom 移动到 oldStartVnode 对应的真实 dom 之前,没找到则重新创建。

2.3 递归处理

三、Vue diff 图解

  • 第一步:创建四个指针,分别为旧 Vnode 的开始指针和结束指针,新 Vnode 的开始指针和结束指针。
  • 第二步:先比较旧 Vnode 的开始指针和新 Vnode 的开始指针,即AE,发现不是同一个节点。
  • 第三步:再比较旧 Vnode 的结束指针和新 Vnode 的结束指针,即DF,依然不是相同节点。
  • 第四步:再比较旧 Vnode 的开始指针和新 Vnode 的结束指针,即AF,不是相同节点。
  • 第五步:再比较旧 Vnode 的结束指针和新 Vnode 的开始指针,即ED,不是相同节点。
  • 第六步:通过上述四种对比方式都不是相同节点,下面就在旧 Vnode 节点中查找是否有与E节点相同的节点。
  • 第七步:发现旧 Vnode 节点中没有E节点,那么就会在旧 Vnode 开始指针前插入一个新的E节点。
  • 第八步:第一个节点操作完后,指针后移,继续进行比较,重复第二至第七步,结果为新增、删除、移动。
  • 第九步:当找到相同节点时,会通过patchVnode进行这两个节点更细致的diff

总结

每次diff都会调用updateChildren方法来比较,然后层层递归下去,直到将旧Vnode和新Vnode中的所有子节点对比完。domDiff的过程更像是两个树的比较,每找到相同节点时,都会一层层的往下比较它们的子节点,是一个深度递归遍历比较的过程。


推荐阅读
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 本文总结了优化代码可读性的核心原则与技巧,通过合理的变量命名、函数和对象的结构化组织,以及遵循一致性等方法,帮助开发者编写更易读、维护性更高的代码。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • Vue 循环渲染中如何正确绑定 key 属性
    本文探讨了在 Vue 的模板循环渲染中,如何正确绑定 key 属性以避免重复键值导致的控制台错误,并确保组件高效更新。 ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
  • 基于结构相似性的HOPC算法:多模态遥感影像配准方法及Matlab实现
    本文介绍了一种基于结构相似性的多模态遥感影像配准方法——HOPC算法,该算法通过相位一致性模型构建几何结构特征描述符,能够有效应对多模态影像间的非线性辐射差异。文章详细阐述了HOPC算法的原理、实验结果及其在多种遥感影像中的应用,并提供了相应的Matlab代码。 ... [详细]
  • 本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • 本文详细介绍了Hive中用于日期和字符串相互转换的多种函数,包括从时间戳到日期格式的转换、日期到时间戳的转换,以及如何处理不同格式的日期字符串。通过这些函数,用户可以轻松实现日期和字符串之间的灵活转换,满足数据处理中的各种需求。 ... [详细]
  • Python中HOG图像特征提取与应用
    本文介绍如何在Python中使用HOG(Histogram of Oriented Gradients)算法进行图像特征提取,探讨其在目标检测中的应用,并详细解释实现步骤。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
author-avatar
浪漫的美食
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有