Vue2、Vue3 和 React 中 Diff 算法的区别

news/2024/7/7 19:37:03 标签: 前端, 前端框架

1、总结版 

DOM diff 本质上就是在数据响应式的场景下,降低了用户对 DOM 的直接操作。

像 Vue2、Vue3 和 React 底层都有用到 DOM diff,它们的相同点呢,就都是同级比对,复杂度差不多;

那不同点呢,一个是指针移动的方向。比如 React 是从左向右移动的,而 Vue2 是双端 diff, 也就是指针是两边向中间移动的。而 Vue3 在 Vue2 双端 diff 的基础上,加上了最长递增子序列优化算法。

从时间复杂度来说呢,Vue2 应该是比 React 快一倍的,但是 Vue3 在 JS 层,它的复杂度就不是 O(n) 了,而是 O(nlogN) 。

而 Vue3 为什么复杂度更高了呢,因为 Vue3 的核心是为了减少 DOM 的移动,因为在浏览器中 JS 速度是很快的,但是 DOM 的移动是很昂贵的,而且 DOM 渲染速度很慢,很影响性能。

而最长递增子序列这个算法能够让 DOM 最小范围的移动。虽然JS复杂度变高了,但是 DOM 移动次数变少了提高了 DOM 的渲染效率以及性能。所以在数据变化比较大的情况下,比较适合用 Vue3 的选型。

2、分析版

Vue2 双端交叉指针,新老 Vdom 各有2个指针,分别进行头头、尾尾、头尾、尾头优化比较;

Vue3 也是双端快速 diff,新老 Vdom 各有2个指针,只比对头头和尾尾,如果能够匹配上,那就跟2.0是一致的。

如果没有匹配上,就会触发最长递增子序列的算法计算,就是在新的 Vdom 里面寻找依次递增的元素有哪些,找到之后,这些元素它的顺序就是固定的,去寻找不在这些列表里面的元素。与老的Vdom进行比对,再进行移动、删除或者创建;

实际上它的时间复杂度是O(nlog(n)),但是在 Vue2 里面,它的复杂度是 O(n)。那这么来看,3.0的复杂度更高了。那为什么要提高复杂度呢?

因为3.0核心是为了减少 DOM 的移动,因为在浏览器中 DOM 的移动它是非常昂贵的,但是 JS 损失一点也没关系。所以总体来看,损失了 JS 的性能,但是提升了浏览器 DOM 的渲染效率,总体来说是利大于弊的。

3、Vue 3.0 使用的 diff 算法相比 Vue 2.0 中的双端比对有以下优势

① 最长递增子序列算法 

Vue 3.0 的 diff 算法采用了最长递增子序列算法,能够减少不必要的 DOM 操作,提升性能。

② 静态标记

Vue 3.0 中,编译器会对静态节点进行标记,在更新时可以直接跳过这些静态节点,减少 DOM 操作,提升性能。

③ 缓存数组

Vue 3.0 中每次更新时会将新旧 VNode 数组缓存起来,只对数组中不同的 VNode 进行比对,减少比对次数,提升性能。

④ 动态删除操作

Vue 3.0 中,对于动态删除操作,采用了异步队列的方式进行,能够将多个删除操作合并为一个,减少 DOM 操作,提升性能。

总的来说,Vue 3.0 的 diff 算法相比 Vue 2.0 更加高效,能够减少不必要的 DOM 操作,提升应用的性能。


http://www.niftyadmin.cn/n/5047835.html

相关文章

安全生产一张图 安全生产三维地理信息平台

一、 建设目标 易图讯科技是一家专业从事大数据、移动互联网、物联网、三维GIS、AI系统研发,开发了三维电子沙盘、AI三维电子沙盘、WEB三维地球、移动端三维地球、数字武装三维电子沙盘、智慧动员三维电子沙盘、智慧公安三维电子沙盘、智慧安监三维电子沙盘、森林防…

微信小程序demo 调用支付jsapi缺少参数 total_fee,支付签名验证失败 究极解决方案

坑一:调用支付jsapi缺少参数 total_fee 修正后的uniapp代码如下: uni.requestPayment({provider: wxpay,timeStamp: String(data.timestamp),nonceStr: data.nonceStr,package: prepay_id data.prepayId,signType: HMAC-SHA256,paySign: data.sign,su…

【量化小技巧】Python通过统计数据来进行过滤tushare涨停Dataframe,df.loc,或许有些启示与帮助

Python通过统计数据来进行过滤tushare涨停Dataframe 库的引入前导发生了什么事儿?上代码将日期设定好将列值提前设置好我们现在来调取tushare的涨停板信息接下来我们稍微进行一个过滤筛选 即将发生的事儿我的考虑错误的方法 总结 库的引入 from datetime import da…

变量、因子、缺失值、类型转换、剔除多余变量、随机抽样、用R使用SQL、trim、na.rm=TRUE、数据标准化应用

变量:名义型、有序型、连续型变量 名义型:普通事件类型,如糖尿病I型和糖尿病II型。 有序型:有顺序的事件类型,如一年级、二年级和三年级。 连续型:表示有顺序的数量,如年龄。 因子:…

OCR -- 文本检测

目标检测: 不仅要解决定位问题,还要解决目标分类问题,给定图像或者视频,找出目标的位置(box),并给出目标的类别; 文本检测: 给定输入图像或者视频,找出文本的…

【操作系统笔记九】并发安全问题

用户态抢占和内核态抢占 内核中可以执行以下几种程序: ① 当前运行的进程:陷阱程序(系统调用) 和 故障程序(page fault) ,进程运行在内核态的时候,其实就是在执行进程在用户态触发的…

《计算机视觉中的多视图几何》笔记(7)

7 Computation of the Camera Matrix P P P 这章讲的是摄像机参数估计。摄像机标定,本质上就是求摄像机矩阵 P P P,当我们知道足够多的 X ↔ x X \leftrightarrow x X↔x,我们该如何计算 P P P?如果知道3D和2D点的对应&#xff…

vue3-ts-vite:Google 多语言调试 / 翻译

一、实现目标 二、代码实现 2.1、项目vue3 - ts - vite 2.2、index.html 引入文件 <script>window.onload function () {const script document.createElement(SCRIPT)script.src https://translate.google.com/translate_a/element.js?cbgoogleTranslateElementI…