vue的diff算法原理

文章详细阐述了Vue的Diff算法,包括其核心的平级比较和双指针策略,以及在处理子节点时的keytag比较、文本节点和列表节点的更新。Vue3采用了不同的优化策略,利用最长递归序列法改进了Diff过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

diff 概念

vue基于虚拟DOM做更新,diff的核心就是比较两个虚拟节点的差异。
vue的diff算法是平级比较,不考虑跨级比较的情况。内部采用深度递归+ 双指针的方式进行比较

在这里插入图片描述

diff比较流程

  1. 先比较是否是相同节点 key tag (标识,标签名)
  2. 相同节点比较属性,并复用老节点(将老的虚拟dom复用给新的虚拟节点dom)
  3. 比较儿子节点,考虑老节点和新节点儿子的情况
      1. 老的没儿子,现在有儿子。直接插入新的儿子
      1. 老的有儿子,新的没儿子。直接删除页面节点
      1. 老的儿子是文本,新的儿子是文本,直接更新文本节点即可
      1. 老的儿子是一个列表,新的儿子也是一个列表 updateChildren – 核心的diff算法,化为数组比对
  4. 列表优化比较(对于列表的情况,updateChildren)

头头尾尾尾头头尾比对查找

头头

先看头指针和头指针,若相同则头指针同时往右移,直到上方的头尾重合遍历完成,把下方的D 直接拿上来
在这里插入图片描述

尾尾

如果头指针和头指针不一样,再看尾指针和尾指针,若相同则尾指针同时往左走,知道上方的头尾重合遍历完成,把下方的D直接拿上来
在这里插入图片描述

头尾

如果头指针和头指针不一样,且尾指针和尾指针不一样,再看头指针和尾指针,若相同则把头指针插到尾指针的后面,头指针往后移,尾指针往前移,—之后再按照 头头,尾尾,头尾,尾头,直到遍历完成
在这里插入图片描述

尾头

如果头指针和头指针不一样,且尾指针和尾指针不一样,头指针和尾指针不一样,,再看尾指针和头指针,若相同则把尾指针插到头指针的前面,尾指针往前移,头指针往后移,—之后再按照 头头,尾尾,头尾,尾头,直到遍历完成
在这里插入图片描述

比对查找

如果头头,尾尾,头尾,尾头都不成立,就会通过对比查找的方式,若下面的头指针的元素,在上面中存在,则会把上面元素的放到头指针前面,下面头指针往后移,上面头指针不变,–之后再按 头头,尾尾,尾头,头尾,对比查找,直到遍历完成
在这里插入图片描述

过程

在这里插入图片描述

与vue3的区别

vue采用的 最长递归序列法 来实现 diff 优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柳晓黑胡椒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值