位置: 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手机验证码验证)

  • 剪映怎么设置视频封面(剪映怎么设置视频时间长短)

    剪映怎么设置视频封面(剪映怎么设置视频时间长短)

  • 华为荣耀20青春版多大内存(华为荣耀20青春版换屏幕多少钱)

    华为荣耀20青春版多大内存(华为荣耀20青春版换屏幕多少钱)

  • 手机号显示是虚拟运营商(手机号显示是虚拟号)

    手机号显示是虚拟运营商(手机号显示是虚拟号)

  • 三星a60开不了机怎么办(三星a60无法开机)

    三星a60开不了机怎么办(三星a60无法开机)

  • 无法接通激活服务器是什么原因(无法接通激活服务器 苹果)

    无法接通激活服务器是什么原因(无法接通激活服务器 苹果)

  • 换主机后怎么连接网络(换主机怎么连接u盘网络)

    换主机后怎么连接网络(换主机怎么连接u盘网络)

  • eslm卡是什么意思(e sim卡是什么卡)

    eslm卡是什么意思(e sim卡是什么卡)

  • 帮助陌生人微信辅助验证对自己有影响吗(帮助陌生人微信辅助验证怎么撤销)

    帮助陌生人微信辅助验证对自己有影响吗(帮助陌生人微信辅助验证怎么撤销)

  • 苹果x安兔兔跑分多少正常(iphonex安兔兔能跑多少分)

    苹果x安兔兔跑分多少正常(iphonex安兔兔能跑多少分)

  • qq电话静音了对方能看到吗(qq电话静音了对方能听到吗华为)

    qq电话静音了对方能看到吗(qq电话静音了对方能听到吗华为)

  • k歌被永久封号怎么办(k歌被永久封号可以注销吗)

    k歌被永久封号怎么办(k歌被永久封号可以注销吗)

  • 如何把两张照片合成一张手机(如何把两张照片合成一张)

    如何把两张照片合成一张手机(如何把两张照片合成一张)

  • 前程无忧简历怎么撤销(前程无忧简历怎么删除)

    前程无忧简历怎么撤销(前程无忧简历怎么删除)

  • 华为nova5i可以投影吗(华为nova5 投屏)

    华为nova5i可以投影吗(华为nova5 投屏)

  • 抖音私密作品怎么删除(抖音私密作品怎么删除啊华为手机)

    抖音私密作品怎么删除(抖音私密作品怎么删除啊华为手机)

  • 微信怎么传原画质视频(微信怎么传原画质视频给好友)

    微信怎么传原画质视频(微信怎么传原画质视频给好友)

  • 手机gps怎么打开(苹果gps怎么开)

    手机gps怎么打开(苹果gps怎么开)

  • qq音乐可以几个人同时用(qq音乐可以几个设备一起登录)

    qq音乐可以几个人同时用(qq音乐可以几个设备一起登录)

  • 无线网络无法启用(无线网络无法启动错误代码10)

    无线网络无法启用(无线网络无法启动错误代码10)

  • lovme是什么牌子手机(loewe是什么品牌)

    lovme是什么牌子手机(loewe是什么品牌)

  • qq怎么升级快(qq怎么升级快不花钱)

    qq怎么升级快(qq怎么升级快不花钱)

  • 微信如何分享聊天记录(微信如何分享聊天语音)

    微信如何分享聊天记录(微信如何分享聊天语音)

  • 苹果手机授信在哪里设置(苹果手机授信功能在哪设置)

    苹果手机授信在哪里设置(苹果手机授信功能在哪设置)

  • 手机接通后听不到对方声音(手机接通后听不见说话)

    手机接通后听不到对方声音(手机接通后听不见说话)

  • 其他权益工具投资科目编码
  • 电子税务局的购票方怎么删除
  • 消费税可以在企业抵扣吗
  • 施工单位企业所得税
  • 员工在公司食堂就餐被烫伤医药费由谁承担
  • 开票系统里红字发票怎么开
  • 现金流量表余额等于货币资金吗
  • 旧房转让土地增值税计算案例
  • 货车压线行驶怎么处罚
  • 摊销折旧是什么意思
  • 融资租入的办公楼属于固定资产吗
  • 费用类都有哪些账户
  • 销售边角料收入属于什么收入
  • 社保扣款上月没扣本月如何做会计处理?
  • 主营业务收入如何红冲
  • 货款为现金如何做记账账款凭证?
  • 全年一次性奖金计税方式2023
  • 发票报销的补助是否缴纳个人所得税?
  • 小额贷款公司可以跨区域经营吗
  • 发了工资了
  • 物业公司代收电费会计分录
  • 汇算清缴所得税账务处理
  • 土地使用权的租赁与出租的区别
  • 销售自建的不动产如何缴纳增值税
  • 低值易耗品包括哪些内容?属于什么科目?
  • linux 部署
  • 飞机电子普通发票6%税率可以抵扣吗
  • 新手刚接触财务
  • 万年青的养殖方法和注意事项盆栽
  • 冈山平原
  • PHP:mcrypt_enc_self_test()的用法_Mcrypt函数
  • 进料加工与来料加工均为一进一出的两笔交易
  • 旅游企业会计ppt
  • elements table
  • php 文件上传类型限制
  • wrme.exe是什么
  • php日期差数
  • 超经营范围开具发票
  • 外管证预缴税费怎么算
  • 30岁之后去面试
  • mapbox怎么用
  • pdclient
  • mysqlbinlog -vvv
  • 织梦文章标题显示不全
  • SQLite教程(十三):C语言编程实例代码(1)
  • mongodb进阶与实战下载
  • 国内旅客运输服务
  • 坏账计提方法会计政策
  • 库存现金的主要内容有哪些
  • 实收资本没有实缴,财务报表里面怎么写
  • 支付的物业费如何做账
  • 坏账损失的会计核算方法
  • 建设期利息有哪些
  • 招标代理服务费应该由谁支付
  • 公司与公司之间的函怎么写
  • 建账时都要建哪些科目
  • 管理费用的明细科目如何设置
  • windowsxp教程
  • centos安装插件
  • window10玩英雄联盟卡顿怎么办
  • ubuntu20.04最小化安装教程
  • Windows(win7/win8/xp/2003)进入安全模式方法详细汇总
  • windows资源监视器
  • windows 10的应用商店中的应用
  • 微软称十年内将淘汰程序员
  • win10预览在哪
  • 牛叉叉旗舰店没有了改名成啥了
  • unity怎么用
  • 安卓画图板
  • 常用dos命令详解
  • jquery easyui validatebox remote的使用详解
  • BaseAdapter数据刷新,自定义BaseAdapter
  • android下载图片并保存到本地
  • python 字典怎么添加数据
  • 查账征收个人经营所得税怎么申报
  • 苏州税务系统
  • 延期审理税务案件的后果
  • 员工的生育津贴计入工资总额吗
  • 进口麦片销售公司
  • 计提缴纳城建税分录
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设