vue中diff算法处理新旧节点的流程

简介: vue中diff算法处理新旧节点的流程

vue中diff算法处理新旧节点的流程


1425695-20211214225117370-1337737002.png1425695-20211215214043938-645770311.png


patch函数的作用


function patch(oldVnode: VNode | Element, vnode: VNode): VNode {
    let i: number, elm: Node, parent: Node;
    const insertedVnodeQueue: VNodeQueue = [];
    for (i = 0; i < cbs.pre.length; ++i) cbs.pre[i]();
    //是虚拟节点还是dom节点,如果是dom节点包装成虚拟节点
    if (!isVnode(oldVnode)) {
      oldVnode = emptyNodeAt(oldVnode);
    }
    // sameVnode函数比较是否是同一个节点
    if (sameVnode(oldVnode, vnode)) {
      patchVnode(oldVnode, vnode, insertedVnodeQueue);
    } else {
      elm = oldVnode.elm!;
      parent = api.parentNode(elm) as Node;
      createElm(vnode, insertedVnodeQueue);
      <!-- 不是同一个节点,暴力拆除 -->
      if (parent !== null) {
        api.insertBefore(parent, vnode.elm!, api.nextSibling(elm));
        removeVnodes(parent, [oldVnode], 0, 0);
      }
    }
    for (i = 0; i < insertedVnodeQueue.length; ++i) {
      insertedVnodeQueue[i].data!.hook!.insert!(insertedVnodeQueue[i]);
    }
    for (i = 0; i < cbs.post.length; ++i) cbs.post[i]();
    return vnode;
  };


patch函数的作用有两点:


1.是虚拟节点还是dom节点,如果是dom节点包装成虚拟节点


2.调用sameVnode函数比较是否是同一个节点。在比较他们的子代


 不是同一个节点,暴力拆除,新节点替换旧节点


sameVnode的比较


通过sameVnode函数去做的处理。


如果新的虚拟节点和旧的虚拟节点的key值相同,并且他们的选择器(tag标签)相同


说明是同一个虚拟节点。{这一句话也是sameVnode函数的工作原理}

function sameVnode(vnode1: VNode, vnode2: VNode): boolean {
  <!-- 新旧节点的key值相同 -->
  const isSameKey = vnode1.key === vnode2.key;
  <!-- 选择器(tag标签)相同 -->
  const isSameSel = vnode1.sel === vnode2.sel;
  return isSameSel && isSameKey ;
}

diff算法处理新旧节点的流程


1.patch函数被调用:是虚拟节点还是dom节点,如果是dom节点包装成虚拟节点。


2.调用sameVnode函数比较是否是同一个节点。如果是在比较他们的子代,


 如果不是暴力拆除,新节点替换旧节点


sameVnode的原理:如果新的虚拟节点和旧的虚拟节点的key值相同,并且他们的选择器(tag标签)相同


说明是同一个虚拟节点。{这一句话也是sameVnode函数的工作原理}


如何知道是虚拟节点还是DOM节点呢


export default function (oldVnode,newVnode) {
  // 通过sel属性或者tag属性是否为空或者undefined说明是DOM节点
  if (oldVnode.sel=='' || oldVnode.sel==undefined) {
    // 说明第一个参数是DOM节点,
   //  通过vnode 将DOM节点包装成虚拟dom节点 
  }
}


再更新节点的时候是:先插入然后再删除


完整图

1425695-20211216204825960-2137070559.png


对diff算法的命中查找的解释


1、新前与旧前


命中结果:新前与旧前下标同时下移


2、新后与旧后


命中结果:新前与旧前下标同时上移


3、新后与旧前


命中结果:移动新前指向的这个节点到老节点的旧后之后 。


4、新前与旧后


命中结果:移动新前指向的这个节点到老节点的旧前前面。


注意的点:


1、命中一种就不在往下判断了,如果都命中不了,就创建一个map映射,移动到旧节点最开始的时候


2、如果旧节点先循环完毕,说明新节点有要插入的节点


相关文章
|
2月前
|
机器学习/深度学习 运维 算法
基于粒子群优化算法的配电网光伏储能双层优化配置模型[IEEE33节点](选址定容)(Matlab代码实现)
基于粒子群优化算法的配电网光伏储能双层优化配置模型[IEEE33节点](选址定容)(Matlab代码实现)
146 0
|
2月前
|
机器学习/深度学习 并行计算 算法
基于改进的粒子群算法PSO求解电容器布局优化问题HV配电中的功率损耗和成本 IEEE34节点(Matlab代码实现)
基于改进的粒子群算法PSO求解电容器布局优化问题HV配电中的功率损耗和成本 IEEE34节点(Matlab代码实现)
|
2月前
|
并行计算 算法 安全
【ADMM、碳排放】基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究【IEEE6节点、IEEE30节点、IEEE118节点】(Matlab代码实现)
【ADMM、碳排放】基于分布式ADMM算法的考虑碳排放交易的电力系统优化调度研究【IEEE6节点、IEEE30节点、IEEE118节点】(Matlab代码实现)
|
3月前
|
机器学习/深度学习 算法 数据挖掘
基于自适应遗传算法风光场景生成的电动汽车并网优化调度【IEEE33节点】(Matlab代码实现)
基于自适应遗传算法风光场景生成的电动汽车并网优化调度【IEEE33节点】(Matlab代码实现)
105 0
|
6月前
|
SQL 分布式计算 DataWorks
使用DataWorks PyODPS节点调用XGBoost算法
本文介绍如何在DataWorks中通过PyODPS3节点调用XGBoost算法完成模型训练与测试,并实现周期离线调度。主要内容包括:1) 使用ODPS SQL构建数据集;2) 创建PyODPS3节点进行数据处理与模型训练;3) 构建支持XGBoost的自定义镜像;4) 测试运行并选择对应镜像。适用于需要集成机器学习算法到大数据工作流的用户。
220 24
|
6月前
|
传感器 算法 数据安全/隐私保护
基于GA遗传优化的三维空间WSN网络最优节点部署算法matlab仿真
本程序基于遗传算法(GA)优化三维空间无线传感网络(WSN)的节点部署,通过MATLAB2022A实现仿真。算法旨在以最少的节点实现最大覆盖度,综合考虑空间覆盖、连通性、能耗管理及成本控制等关键问题。核心思想包括染色体编码节点位置、适应度函数评估性能,并采用网格填充法近似计算覆盖率。该方法可显著提升WSN在三维空间中的部署效率与经济性,为实际应用提供有力支持。
|
JavaScript 算法 前端开发
vue 中diff算法
【10月更文挑战第10天】
321 137
|
9月前
|
传感器 算法 物联网
基于粒子群算法的网络最优节点部署优化matlab仿真
本项目基于粒子群优化(PSO)算法,实现WSN网络节点的最优部署,以最大化节点覆盖范围。使用MATLAB2022A进行开发与测试,展示了优化后的节点分布及其覆盖范围。核心代码通过定义目标函数和约束条件,利用PSO算法迭代搜索最佳节点位置,并绘制优化结果图。PSO算法灵感源于鸟群觅食行为,适用于连续和离散空间的优化问题,在通信网络、物联网等领域有广泛应用。该算法通过模拟粒子群体智慧,高效逼近最优解,提升网络性能。
314 16
|
算法 JavaScript
Vue 中的 Diff 算法
【10月更文挑战第18天】需要注意的是,Diff 算法虽然能够提高性能,但在某些复杂的场景下,可能仍然会存在一些性能瓶颈。因此,在实际开发中,我们需要根据具体情况合理地使用 Diff 算法,并结合其他优化手段来提高应用的性能。
183 56
|
12月前
|
监控 JavaScript 算法
深度剖析 Vue.js 响应式原理:从数据劫持到视图更新的全流程详解
本文深入解析Vue.js的响应式机制,从数据劫持到视图更新的全过程,详细讲解了其实现原理和运作流程。

热门文章

最新文章