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

Vue diff简介

Vue3 diff

最长递增子序列+双端diff

理念

  1. 相同的前置和后置元素的预处理,考虑边界情况,减少移动;
  2. 最长递增子序列(动态规划、二分法),判断是否需要移动

操作

  1. 前置与后置预处理
  2. 判断是否需要移动
    递增法:根据新列表剩余的节点数,创建一个source数组,填入-1,存储新节点在旧节点的位置,再算出source中最长递增子序列,用于移动DOM,如旧节点在新列表中没有,则直接删除
  3. 移动DOM:根据source对新列表进行重新编号,找到source的最长递增子序列在原本数组中的索引,创建一个数组保存每个值的最长子序列在数组中的index,然后从后向前遍历source
    • 当前index=-1,则创建DOM节点插入队尾
    • 当前index为最长递增子序列中的值,则不需要移动,判断是否有全新的节点添加
    • 当前index不在最长递增子序列中,则移动,将DOM节点插入队尾

细节

  1. 同层级比较
  2. 节点类型判断:不同类型直接替换
  3. key值比较:相同key可复用
  4. 属性比较:只更新变化的属性

Vue2 diff

双端比较
缺乏事件切片能力,除了高帧率动画,其他场景都可以使用防抖和节流提高响应性能

理念

新列表和旧列表两个列表的头和尾互相对比,在对比的过程中指针会逐渐向内靠拢,直到某一个列表的节点全部遍历过,对比停止

过程

  1. vue的diff算法是平级比较,不考虑跨级比较的情况,即只有在新旧children都为多个子节点时才需要使用diff算法进行同层级比较
  2. 内部采用深度递归的方式+双指针的方式进行比较
    • 旧children和新children各有两个头尾的变量startIdx和EndIdx,头头、尾尾、头尾、尾头进行对比,一共四种比较方式
      • 使用旧列表的头一个节点与新列表的头一个节点对比
      • 使用旧列表的最后一个节点与新列表的最后一个节点对比
      • 使用旧列表的头一个节点与新列表的最后一个节点对比
      • 使用旧列表的最后一个节点与新列表的头一个节点对比去
        寻找key相同的可复用的节点,如果找到则停止后面的寻找;
    • 四种方式都没匹配,如果设置了key,就用key进行比较,拿新列表中第一个节点去旧列表中找与其key相同的节点
      • 在旧列表中找到了:移动找到的节点,旧列表中的节点改为undefined,移动过的节点不需要再进行节点对比;
      • 在旧列表中没找到:创建新节点放到最前面在比较中,变量会往中间靠,如果startIdx>EndIdx,表明旧children和新children至少有一个已经遍历完成,结束比较
  3. vue的diff算法称为patching算法,diff执行时刻是组件内响应式数据变更触发实例执行其更新函数,再次执行render函数得到最新的虚拟DOM,然后执行patch函数,并传入新旧两次的虚拟DOM,对比找到变化,将其转化为对应的DOM操作
  4. patch过程是递归过程,遵循深度优先,同层比较的策略

Vue3 diff和Vue2 diff比较

  1. 最长递增子序列算法
    减少不必要的DOM操作,提升性能
  2. 静态标记
    更新时跳过静态节点
  3. 缓存数组
    将新旧VNode数组缓存,只对数组中不同的VNode对比,减少比对次数,提升性能
  4. 动态删除数组
    异步队列方式,将多个删除操作合并
http://www.lryc.cn/news/624254.html

相关文章:

  • Rust学习笔记(六)|Rust 中的常用集合(Vector、String、HashMap)
  • MiniMax Agent 上线 Market Place ,AI一键复制克隆网站
  • 部署 HAProxy 高可用
  • python 数据拟合(线性拟合、多项式回归)
  • Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
  • 云计算:企业数字化转型的核心引擎
  • Kubernetes(K8s)常用命令全解析:从基础到进阶
  • 【Kubernetes】在 K8s 上部署 Prometheus
  • C语言基础:变量与进制详解
  • K8s的命名空间需要创建吗
  • 工具集成强化学习:AI数学推理能力的新跃迁
  • Java基础(九):Object核心类深度剖析
  • 图神经网络分享系列-node2vec(二)
  • 基于51单片机WIFI心率计脉搏体温测量仪APP设计
  • HTML应用指南:利用POST请求获取全国华为旗舰店门店位置信息
  • 《若依》权限控制
  • 上下文切换及线程操作相关内容
  • 学习雪花算法
  • linux-高级IO(中)
  • 【BFS 动态规划】P12382 [蓝桥杯 2023 省 Python B] 树上选点|普及+
  • Redis面试精讲 Day 25:Redis实现分布式Session与购物车
  • 【前端】使用Vue3过程中遇到加载无效设置点击方法提示不存在的情况,原来是少加了一个属性
  • [激光原理与应用-296]:理论 - 非线性光学 - 线性光学与非线性光学对比
  • (第十九期)用 VS Code 管理项目:目录文件夹与根目录,一次讲清
  • Vulkan笔记(五)-逻辑层与队列
  • halcon基于透视的可变形模型匹配
  • C预备知识01:
  • 数字电视:技术演进与未来展望
  • 用户认证技术
  • MySQL 函数大赏:聚合、日期、字符串等函数剖析