当前位置: 首页 > article >正文

vue的diff算法?

文章目录

  • 是什么
      • 比较方式
      • 原理分析
      • Diff算法的步骤:
      • 首尾指针法
      • 比对顺序:


是什么

diff 算法是一种通过同层的树节点进行比较的高效算法
其有两个特点:

比较只会在同层级进行, 不会跨层级比较
在diff比较的过程中,循环从两边向中间比较

比较方式

diff整体策略为:深度优先,同层比较

  • 比较只会在同层级进行, 不会跨层级比较
  • 比较的过程中,循环从两边向中间收拢

原理分析

在这里插入图片描述

Diff算法的步骤:

之后判断新旧两个节点是否为同类标签,如果不是同类标签就直接替换;如果是同类标签的话,进一步执行patchVnode()方法,在这个方法内部,也是需要先判断一下新旧虚拟节点是否相同,如果相等,就直接return;如果不相等就需要分情况来比对,比对的原则就是以新虚拟节点的结果为准,分为以下几种情况:

oldvnode和newvnode都有文本节点—执行—>用新的文本节点替换旧文本节点
oldvnode没有子节点,newvnode有子节点—执行—>添加新的子节点
oldvnode有子节点,newvnode没有子节点—执行—>删除旧的子节点
oldvnode和newvnode都有子节点—执行—>updateChildren()方法

首尾指针法

    ①依次比对,当比较成功后退出当前比较

    ②渲染结构以newVnode为准

    ③每次比较成功之后start点和end点向中间靠拢

    ④当新旧节点中有一个start点跑到end点右侧时终止比较

    ⑤如果都匹配不到,则旧虚拟DOM key只去比对新虚拟DOM的key值,
    如果key相同则复用,并移动到新虚拟DOM的位置

比对顺序:

  • 首先,旧虚拟节点的start和新虚拟节点的start做比对,如果没有比对成功,就用旧虚拟节点的start和新虚拟节点的end做比对。

  • 如果依旧没有比对成功,就用旧虚拟节点的end和新虚拟节点的start做比对,如果依旧没有比对成功,旧虚拟节点的end会和新虚拟节点的end做比对

  • 当比对成功,就退出当前比对,渲染结果会以新虚拟节点的结果为准

  • 每次比对成功后,比对成功的start会向右侧移动,end会向左侧移动。在移动的过程中,当start点跑到end点右侧的时候就终止比较。


http://www.kler.cn/a/1602.html

相关文章:

  • 【CSS】设置滚动条样式
  • VSCode Live Server 插件安装和使用
  • 【马来西亚理工大学主办,ACM出版】2025年大数据、通信技术与计算机应用国际学术会议(BDCTA 2025)
  • 案例解读 | 香港某多元化综合金融企业基础监控+网管平台建设实践
  • 【SQL】掌握SQL查询技巧:数据分组与排序
  • 课题推荐——基于GPS的无人机自主着陆系统设计
  • 我的创作纪念日——一年的时间可以改变很多
  • 使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录
  • 深入理解KMP算法
  • 【JavaEE】如何将JavaWeb项目部署到Linux云服务器?
  • 华为OD机试 - 货币单位换算(C 语言解题)【独家】
  • 开发也可以很快乐,让VSCode和CodeGPT带给你幸福感
  • 【Hello Linux】进程间通信
  • 浅谈C库函数——memcpy、memmove、memcmp、memset函数
  • 【日志包】go语言如何设计日志包 - 基于zap封装适合自己的日志包
  • Servlet的详细使用
  • OpenCv + Qt5.12.2 文字识别
  • JVM学习.01 内存模型
  • C语言刷题(6)(猜名次)——“C”
  • linux进程和进程通信编程(1)
  • 软件测试 - 非技术常见面试题
  • 【C++学习】日积月累——SLT中stack使用详解(1)
  • 012+limou+C语言深入知识——(4)“结构体”与“枚举体”与“联合体”
  • 011+limou+C语言深入知识——(3)“字符串函数”和“字符分类函数”和“内存操作函数”以及“部分库函数的模拟实现”
  • 【DP动态规划】最长子序列
  • [数据分析与可视化] Python绘制数据地图1-GeoPandas入门指北