位置: IT常识 - 正文

Vue3 diff算法图解分析(vue2 diff算法)

编辑:rootadmin
Vue3 diff算法图解分析 大家好,我是剑大瑞,本篇文章主要分析Vue3 diff算法,通过本文你可以知道: diff的主要过程,核心逻辑 diff是如何进行节点复用、移动、卸载 并有一个示例题,可以结合本文进行练习分析 如果你还不是特别了解Vnode、渲染器的patch流程,建议先阅读下面两篇 ... Vue3 diff算法图解分析

推荐整理分享Vue3 diff算法图解分析(vue2 diff算法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue3 diff算法原理,vue diff算法详解,vue differ,vue中diff,vue3.0 diff 算法,vuediff算法原理,vue3的diff算法,vue3.0 diff 算法,内容如对您有帮助,希望把文章链接给更多的朋友!

大家好,我是剑大瑞,本篇文章主要分析Vue3 diff算法,通过本文你可以知道:

diff的主要过程,核心逻辑diff是如何进行节点复用、移动、卸载并有一个示例题,可以结合本文进行练习分析

如果你还不是特别了解Vnode、渲染器的patch流程,建议先阅读下面两篇文章:

Vnode渲染器分析1.0 diff 无key子节点

在处理被标记为UNKEYED_FRAGMENT时。

首先会通过新旧子序列获取最小共同长度commonLength。

对公共部分循环遍历patch。

patch 结束,再处理剩余的新旧节点。

如果oldLength > newLength,说明需要对旧节点进行unmount

否则,说明有新增节点,需要进行mount;

Vue3 diff算法图解分析(vue2 diff算法)

这里贴下省略后的代码。

const patchUnkeyedChildren = (c1, c2,...res) => { c1 = c1 || EMPTY_ARR c2 = c2 || EMPTY_ARR // 获取新旧子节点的长度 const oldLength = c1.length const newLength = c2.length // 1. 取得公共长度。最小长度 const commonLength = Math.min(oldLength, newLength) let i // 2. patch公共部分 for (i = 0; i < commonLength; i++) { patch(...) } // 3. 卸载旧节点 if (oldLength > newLength) { // remove old unmountChildren(...) } else { // mount new // 4. 否则挂载新的子节点 mountChildren(...) } }

从上面的代码可以看出,在处理无key子节点的时候,逻辑还是非常简单粗暴的。准确的说处理无key子节点的效率并不高。

因为不管是直接对公共部分patch,还是直接对新增节点进行mountChildren(其实是遍历子节点,进行patch操作),其实都是在递归进行patch,这就会影响到性能。

2.0 diff 有key子节点序列

在diff有key子序列的时候,会进行细分处理。主要会经过以下一种情况的判断:

起始位置节点类型相同。结束位置节点类型相同。相同部分处理完,有新增节点。相同部分处理完,有旧节点需要卸载。首尾相同,但中间部分存在可复用乱序节点。

在开始阶段,会先生面三个指正,分别是:

i = 0,指向新旧序列的开始位置e1 = oldLength - 1,指向旧序列的结束位置e2 = newLength - 1,指向新序列的结束位置

let i = 0const l2 = c2.lengthlet e1 = c1.length - 1 // prev ending indexlet e2 = l2 - 1 // next ending index

下面开始分情况进行diff处理。

2.1 起始位置节点类型相同

对于起始位置类型相同的节点,从左向右进行diff遍历。

如果新旧节点类型相同,则进行patch处理

节点类型不同,则break,跳出遍历diff

// i <= 2 && i <= 3while (i <= e1 && i <= e2) { const n1 = c1[i] const n2 = c2[i] if (isSameVNodeType(n1, n2)) { // 如果是相同的节点类型,则进行递归patch patch(...) } else { // 否则退出 break } i++}

上面上略了部分代码,但不影响主要逻辑。

从代码可以知道,遍历时,利用前面在函数全局上下文中

本文链接地址:https://www.jiuchutong.com/zhishi/303770.html 转载请保留说明!

上一篇:2 BASH 的基本语法(bash的主要功能)

下一篇:phpcms phpsso验证码错误(php手机验证码验证)

  • xr两张卡怎么放(xr双卡怎么放进去)

    xr两张卡怎么放(xr双卡怎么放进去)

  • 抖音蓝v有什么好处吗(抖音蓝v有什么好处和坏处)

    抖音蓝v有什么好处吗(抖音蓝v有什么好处和坏处)

  • 华为p40是单挖孔吗(华为p40pro挖孔屏有什么功能)

    华为p40是单挖孔吗(华为p40pro挖孔屏有什么功能)

  • 微信的夜间模式怎么调(如何取消微信的夜间模式)

    微信的夜间模式怎么调(如何取消微信的夜间模式)

  • 苹果手机闹钟稍后提醒间隔要怎么设置(苹果手机闹钟稍后提醒怎么关闭)

    苹果手机闹钟稍后提醒间隔要怎么设置(苹果手机闹钟稍后提醒怎么关闭)

  • qq互动标识有哪些(qq互动标识有哪些图片)

    qq互动标识有哪些(qq互动标识有哪些图片)

  • 你的id目前无法使用双重认证(你的id目前无法使用)

    你的id目前无法使用双重认证(你的id目前无法使用)

  • 华为手机怎么设置蓝牙名称(华为手机怎么设置紧急联系人)

    华为手机怎么设置蓝牙名称(华为手机怎么设置紧急联系人)

  • 抖音为什么会被限流(抖音为什么会被盗号)

    抖音为什么会被限流(抖音为什么会被盗号)

  • 手机打字怎么跳到下一行(手机打字怎么跳到下一行没有回车键)

    手机打字怎么跳到下一行(手机打字怎么跳到下一行没有回车键)

  • 固态硬盘怎么接主板(固态硬盘怎么接线)

    固态硬盘怎么接主板(固态硬盘怎么接线)

  • 毒app可以换尺码吗(毒能不能换尺码)

    毒app可以换尺码吗(毒能不能换尺码)

  • 华为两个微信设置方法(华为两个微信设置)

    华为两个微信设置方法(华为两个微信设置)

  • 美柚里的周期什么意思(美柚上的周期是什么意思)

    美柚里的周期什么意思(美柚上的周期是什么意思)

  • 美团怎么申请返现(美团怎么申请返现酒店)

    美团怎么申请返现(美团怎么申请返现酒店)

  • ipad11支持无线充电吗(ipad11能无线充电吗)

    ipad11支持无线充电吗(ipad11能无线充电吗)

  • 小米手机gps设置在哪里(小米手机gps在哪里设置)

    小米手机gps设置在哪里(小米手机gps在哪里设置)

  • 荣耀20多少寸(荣耀80pro直屏版上市时间)

    荣耀20多少寸(荣耀80pro直屏版上市时间)

  • 头条上的视频怎么保存到本地(头条上的视频怎么转发到微信上)

    头条上的视频怎么保存到本地(头条上的视频怎么转发到微信上)

  • 前程无忧如何注销账号(前程无忧如何注册个人账号)

    前程无忧如何注销账号(前程无忧如何注册个人账号)

  • 解决报错:Uncaught TypeError: Cannot read properties of undefined (reading ‘install‘)(unsupportedfirsthd解决办法)

    解决报错:Uncaught TypeError: Cannot read properties of undefined (reading ‘install‘)(unsupportedfirsthd解决办法)

  • Win11 Insider Preview Build 22463更新推送(附更新、修复内容汇总)(win11 insider preview怎么升级正式版)

    Win11 Insider Preview Build 22463更新推送(附更新、修复内容汇总)(win11 insider preview怎么升级正式版)

  • 当月出口的货物,可以过几个月申报吗
  • 白酒的品牌使用费含增值税吗
  • 二手车经纪公司和中介的区别
  • 详述关税的种类和征收方法
  • 投资性房地产在非货币性资产交换怎么处理
  • 接受资不抵债并账会计分录
  • 无形资产升值怎么处理
  • 建筑服务预征缴纳税款本期实际抵减税额怎么填
  • 在计算缴纳房产税时,不计入房产原值的是
  • 社保如何会计处理
  • 其他业务利润怎么算公式
  • 无形资产是金融性资产还是经营性资产
  • 采购折扣怎么结转成本?
  • 金税盘抄税报税流程
  • 税收分类编码如何填写
  • 源泉扣缴税率是多少
  • 月工资3000元,工伤7级能赔偿多少钱
  • 加工费的增值税税率是多少
  • 工程结算审计费用谁承担
  • 普通发票收款方账号信息错了可以正常报销吗
  • 没有产权的房子可以公证吗
  • 金税盘抄税报税清卡流程图
  • 什么是民政福利企业
  • 企业所得税以前年度所得调整
  • 总公司和分公司的合作协议
  • 发票已认证次月冲红
  • 公益事业捐赠
  • 企业收到银行未收到怎么做账
  • 高新企业研发费用占销售收入的比例
  • 如何安全的处置电子邮件
  • 母子公司吸收合并优劣势
  • PHP:session_get_cookie_params()的用法_Session函数
  • 电脑右键一直转圈
  • 装修费怎么记会计科目
  • k210中文手册
  • win7系统安装包多大
  • 一只草丛里的狐狸作文
  • 酒店里用了收费的东西怎么算
  • 如何计提加计抵减额分录
  • 在Windowsserver2019环境下,配置IP地址使用
  • 退款会退货吗
  • php读取excel文件
  • php安装oci8
  • 原生js获取元素高度
  • 注意力机制的作用
  • 泛化的理解
  • 财务章有几种样式
  • 无形资产转让的最低收费额如何确定?
  • 什么情况下要开外经证
  • 承租方承担税费
  • 加油充值预付卡怎么做账
  • 劳务派遣公司必须有劳务派遣证吗
  • 企业的资产必须符合哪些条件
  • 清理扬声器
  • powerdesigner生成pdm
  • mysql导入sql文件命令
  • 企业所得税中资产计税基础怎么填
  • 社区居委会有哪些成员
  • 所得税季度申报弥补以前年度亏损
  • 收到暂估跨年发票怎么办
  • 应用《企业会计》的论文
  • 分公司有独立账套吗
  • 预收账款和应收账款可以放在一个账户
  • sqlserver 版本号
  • mysql precision
  • mysql开发语言
  • mysql缓冲区
  • 打印机向windows发送消息
  • 邻居家的wifi隐藏后如何连接
  • 虚拟机vmware下载教程
  • win8怎么看windows
  • 苹果mac系统怎么截屏快捷键
  • win7系统自带刻录启用
  • squid服务器配置
  • win7任务栏透明调不了
  • 微信小程序异步回调函数
  • 文件夹如何取名字
  • js获取宽高
  • python汉字
  • 陕西税务干部学校副教授李刚简历
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设