vue 中diff算法

简介: vue 中diff算法

1. 前言

  1. vue 中的虚拟 DOM,diff算法,大家都有所耳闻
  2. 但是总感觉不那么透彻,所以看了几遍官网,简单整理如下
  3. 后续发现有文章总结,但是在github上面,有些人可能访问不到,所以我就简单写下

2. 虚拟 DOM 是什么 what

  1. 虚拟 DOM (Virtual DOM,简称 VDOM) 是一种编程概念,意为将目标所需的 UI 通过数据结构“虚拟”地表示出来,保存在内存中,然后将真实的 DOM 与之保持同步。
  2. 这个概念是由 React 率先开拓,随后在许多不同的框架中都有不同的实现,当然也包括 Vue
  3. 与其说虚拟 DOM 是一种具体的技术,不如说是一种模式,所以并没有一个标准的实现

3. diff 算法 是什么 what

  1. 如果我们有两份虚拟 DOM 树,渲染器将会有比较遍历它们,找出它们之间的区别,并应用这其中的变化到真实的 DOM 上。这个过程被称为更新 (patch),又被称为“比对”(diffing) 或“协调”(reconciliation)。
  2. 一个运行时渲染器将会遍历整个虚拟 DOM 树,并据此构建真实的 DOM 树。这个过程被称为挂载 (mount)。
  3. 也就是说diff算法是在 挂载 的时候,对虚拟 DOM /新旧 VNode 进行比对的算法
  4. 再具体diff 算法是一种通过同层的树节点进行比较的高效算法

4. 特点

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

5. 比较方式

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

    image.png
    image.png
  2. 比较的过程中,循环从两边向中间收拢
    image.png

    image.png

6. 原理分析

  1. 当数据发生改变时,set方法会调用Dep.notify通知所有订阅者Watcher订阅者就会调用patch给真实的DOM打补丁,更新相应的视图
  2. 源码位置:src/core/vdom/patch.js
  3. 主要是一个 function patch(oldVnode, vnode, hydrating, removeOnly) {}函数
  4. function patchVnode (oldVnode, vnode, insertedVnodeQueue, removeOnly) {}
  5. 源码挺多的也有分析原址

7.  小结

  1. 当数据发生改变时,订阅者watcher就会调用patch给真实的DOM打补丁
    通过isSameVnode进行判断,相同则调用patchVnode方法
  2. patchVnode做了以下操作:
    2.1 找到对应的真实dom,称为el
    2.2 如果都有都有文本节点且不相等,将el文本节点设置为Vnode的文本节点
    2.3 如果oldVnode有子节点而VNode没有,则删除el子节点
    2.4 如果oldVnode没有子节点而VNode有,则将VNode的子节点真实化后添加到el
    如果两者都有子节点,则执行updateChildren函数比较子节点
  3. updateChildren主要做了以下操作:
    3.1 设置新旧VNode的头尾指针
    3.2 新旧头尾指针进行比较,循环向中间靠拢,根据情况调用patchVnode进行patch重复流程、调用createElem创建一个新节点,从哈希表寻找 key一致的VNode 节点再分情况操作

参考资料

官方虚拟 DOM

原址


初心

我所有的文章都只是基于入门,初步的了解;是自己的知识体系梳理;如有错误,欢迎交流;
如果能帮助到有缘人,非常的荣幸,一切为了部落的崛起;
共勉
相关文章
|
3月前
|
算法 JavaScript UED
Diff 算法的实现原理
【10月更文挑战第18天】Diff 算法是 Vue.js 中实现高效 DOM 更新的核心机制,通过合理的比较和优化策略,能够在保证界面正确性的同时,最大程度地减少 DOM 操作,提高应用的性能和用户体验。
48 2
|
3月前
|
算法 JavaScript
Vue 中的 Diff 算法
【10月更文挑战第18天】需要注意的是,Diff 算法虽然能够提高性能,但在某些复杂的场景下,可能仍然会存在一些性能瓶颈。因此,在实际开发中,我们需要根据具体情况合理地使用 Diff 算法,并结合其他优化手段来提高应用的性能。
22 1
|
3月前
|
JavaScript 算法 前端开发
vue 中diff算法
【10月更文挑战第10天】
45 1
|
3月前
|
JavaScript 算法 前端开发
【VUE】Vue的diff算法和React的diff算法
【VUE】Vue的diff算法和React的diff算法
|
4月前
|
机器学习/深度学习 JavaScript 算法
面试中的网红虚拟DOM,你知多少呢?深入解读diff算法
该文章深入探讨了虚拟DOM的概念及其diff算法,解释了虚拟DOM如何最小化实际DOM的更新,以此提升web应用的性能,并详细分析了diff算法的实现机制。
|
12天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
145 80
|
6天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
8天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
5天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
9天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。

热门文章

最新文章