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

  • oppo手机微信红包提醒如何设置(oppo手机微信红包提示音在哪里设置)

    oppo手机微信红包提醒如何设置(oppo手机微信红包提示音在哪里设置)

  • 微信群收款功能在哪(微信群收款功能没有了)

    微信群收款功能在哪(微信群收款功能没有了)

  • 影驰主板u盘启动按f几(影驰主板u盘启动按f9没反应)

    影驰主板u盘启动按f几(影驰主板u盘启动按f9没反应)

  • qq微笑表情什么意思(qq微笑表情什么时候上线)

    qq微笑表情什么意思(qq微笑表情什么时候上线)

  • 苹果8plus长度(苹果8plus手机长度是几厘米)

    苹果8plus长度(苹果8plus手机长度是几厘米)

  • wps操作权限不足(wps操作权限不足是什么意思)

    wps操作权限不足(wps操作权限不足是什么意思)

  • 小米10与魅族17对比(小米10svs魅族17)

    小米10与魅族17对比(小米10svs魅族17)

  • 安卓怎么使用苹果手表(安卓怎么使用苹果主题)

    安卓怎么使用苹果手表(安卓怎么使用苹果主题)

  • 苹果全屏手机有哪几款(苹果全屏是什么型号)

    苹果全屏手机有哪几款(苹果全屏是什么型号)

  • iphonexr夜间耗电严重原因(xr夜间掉电)

    iphonexr夜间耗电严重原因(xr夜间掉电)

  • 苹果lla是哪个国家(ll/a是什么版本的苹果手机)

    苹果lla是哪个国家(ll/a是什么版本的苹果手机)

  • 快手极速版邀请好友的钱多久到账(快手极速版邀请新人奖励审核多久)

    快手极速版邀请好友的钱多久到账(快手极速版邀请新人奖励审核多久)

  • 小米手机进水了屏幕失灵怎么办(小米手机进水了怎么办)

    小米手机进水了屏幕失灵怎么办(小米手机进水了怎么办)

  • 电话右上角出现HD怎么回事(电话右上角出现hd是什么意思)

    电话右上角出现HD怎么回事(电话右上角出现hd是什么意思)

  • 手机指南针不动怎么办(苹果手机指南针不动)

    手机指南针不动怎么办(苹果手机指南针不动)

  • 苹果5微信不兼容怎么办(苹果5微信不兼容了怎么解决)

    苹果5微信不兼容怎么办(苹果5微信不兼容了怎么解决)

  • 座机暂停服务是啥意思(座机的暂停是什么意思)

    座机暂停服务是啥意思(座机的暂停是什么意思)

  • 卡贴iphone怎么开热点(卡贴怎么打开)

    卡贴iphone怎么开热点(卡贴怎么打开)

  • 苹果11pro怎么插双卡(苹果11pro怎么插耳机)

    苹果11pro怎么插双卡(苹果11pro怎么插耳机)

  • 飞行模式旁边的图标是什么(飞行模式旁边的那个是开流量的吗)

    飞行模式旁边的图标是什么(飞行模式旁边的那个是开流量的吗)

  • 糖果交换密码是什么(糖果置换交易网站)

    糖果交换密码是什么(糖果置换交易网站)

  • 华为型号stf_al10(华为型号STK-AL00)

    华为型号stf_al10(华为型号STK-AL00)

  • word添加分割线怎么设置(word添加分割线条)

    word添加分割线怎么设置(word添加分割线条)

  • 苹果手机屏幕保护时间怎么设置(苹果手机屏幕保修吗)

    苹果手机屏幕保护时间怎么设置(苹果手机屏幕保修吗)

  • Vue中splice()方法:实现对数组进行增删改的操作(vue的slice)

    Vue中splice()方法:实现对数组进行增删改的操作(vue的slice)

  • 个税新规定2021
  • 我公司租了个人的房子如何入账
  • 办公室购买清洁剂
  • 中药材适用税率是多少
  • 专用基金计入什么科目
  • 工业企业会计怎么结转成本
  • 增值税专票怎么抵扣
  • 销售商品房属于什么税
  • 资产负债率计算方式
  • 库存商品报废进项转出
  • 代扣税金是什么意思
  • 税金及附加是根据什么填列的
  • 税后工资反推税前工资计算方法
  • 刻章后的发票要打印吗
  • 简易注销还要去找专管员
  • 增值税的税负率的计算公式
  • 30万以下免征附加税包含30万吗
  • 汽车折旧计算方法按照公里
  • 专票电话写错了怎么办
  • 小规模纳税人增值税超过30万怎么纳税
  • 涉税票据如何避免税务风险?
  • 企业所得税的工资薪金包括社保
  • 存货跌价准备会影响利润吗
  • 残保金必须交社保才能领吗
  • win7系统中文乱码怎么解决
  • 税金及附加多计提所得税年报怎么更正
  • 推广费开票属于什么费用
  • 未到期的应收票据向银行贴现什么时候计入短期贷款
  • pctversion
  • 采用账龄分析法计提坏账准备
  • layui表格编辑功能
  • 依夫城堡
  • PHP:JDToJulian()的用法_日历函数
  • 减免税款账务处理
  • laravel定时任务如何实现的
  • 控制层框架
  • symfony框架经验总结
  • php构造函数重载
  • ts与js的优缺点
  • css动画效果代码
  • sftp 加密算法
  • php获取用户信息
  • 小规模纳税人申报表模板
  • 固定资产折完了怎么办
  • etc电子发票需要多久才能开
  • python中列表的索引用法
  • 公司还款给个人怎么操作
  • hadoop集群状态
  • 新公司财务需要哪些东西
  • 盈余公积的计提基数
  • 用留存收益筹资为什么没有占用费
  • 取得抵债资产
  • 积分兑换如何做表格分析
  • 外购材料并提供建筑服务
  • 专用发票冲红有时间有时间限制吗
  • 不征税发票和零税率发票
  • 职工教育经费开专票可以抵扣吗
  • 企业所得税必须预缴吗
  • 企业明细是什么
  • mysql local-infile
  • telnet root
  • win10系统开机蓝屏怎么修复
  • 计算机的硬盘
  • Unity3D游戏开发引擎
  • js中的
  • android系统分区理解及分区目录细解
  • python任务调度之schedule
  • javascript的对象主要包括
  • angular使用
  • 浅谈python
  • unity图集作用
  • javascript要学到什么程度
  • jquery设置滚动条
  • 如何查询自己公司的对公账号
  • 农业栽培技术
  • 企业所得税申报表怎么填写
  • 发票如何验真伪?
  • 江苏钢厂排名前十
  • 购房发票的发票代码是哪个
  • 乌市沙区医保局电话是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设