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

  • 苹果13有1tb版本吗(苹果13有没有1t内存)

    苹果13有1tb版本吗(苹果13有没有1t内存)

  • 苹果手机打游戏怎么设置消息免打扰(苹果手机打游戏时屏幕突然变暗)

    苹果手机打游戏怎么设置消息免打扰(苹果手机打游戏时屏幕突然变暗)

  • mate30发布会在哪直播(华为mate30发布会图文)

    mate30发布会在哪直播(华为mate30发布会图文)

  • 华为手机简体字繁体字在哪里切换(华为手机简体字繁体字转换器)

    华为手机简体字繁体字在哪里切换(华为手机简体字繁体字转换器)

  • 一个手机号怎么注册两个抖音号(一个手机号怎么注册多个抖音号)

    一个手机号怎么注册两个抖音号(一个手机号怎么注册多个抖音号)

  • apple id更新设置是什么意思(appleid更新设置继续无反应)

    apple id更新设置是什么意思(appleid更新设置继续无反应)

  • wifi信号满格但网速慢(WiFi信号满格但不能上网)

    wifi信号满格但网速慢(WiFi信号满格但不能上网)

  • 苹果手机照片有感叹号怎么办(苹果手机照片有感叹号模糊怎么回事)

    苹果手机照片有感叹号怎么办(苹果手机照片有感叹号模糊怎么回事)

  • 华硕笔记本黑屏唤不醒(华硕笔记本黑屏了怎么办)

    华硕笔记本黑屏唤不醒(华硕笔记本黑屏了怎么办)

  • 微信能在电视上登录吗(微信在电视上怎么登陆)

    微信能在电视上登录吗(微信在电视上怎么登陆)

  • 鼠标左侧的两个按钮是干什么用的(鼠标左侧的两个按钮是干什么用的 鼠标介绍)

    鼠标左侧的两个按钮是干什么用的(鼠标左侧的两个按钮是干什么用的 鼠标介绍)

  • vivo手机fast boot什么意思(vivo手机fastboot怎么开机)

    vivo手机fast boot什么意思(vivo手机fastboot怎么开机)

  • 探探往左滑是什么意思(探探往左滑右滑怎么办)

    探探往左滑是什么意思(探探往左滑右滑怎么办)

  • 魅族x8怎么关闭开发者模式(魅族怎么关闭flyme)

    魅族x8怎么关闭开发者模式(魅族怎么关闭flyme)

  • 如何将b站视频下至本地(如何将b站视频弄到PPT里)

    如何将b站视频下至本地(如何将b站视频弄到PPT里)

  • 荣耀20青春版怎么打开智能助手(荣耀20青春版怎么换屏幕)

    荣耀20青春版怎么打开智能助手(荣耀20青春版怎么换屏幕)

  • 滴答出行车主认证条件(滴答出行车主认证收费吗?)

    滴答出行车主认证条件(滴答出行车主认证收费吗?)

  • 小米6x是什么处理器(小米6x是什么处理器型号)

    小米6x是什么处理器(小米6x是什么处理器型号)

  • 哈罗单车怎么进行充值(哈罗单车怎么进不去了)

    哈罗单车怎么进行充值(哈罗单车怎么进不去了)

  • 华为p30息屏显示时间(华为手机灭屏显示时间怎么设置p30)

    华为p30息屏显示时间(华为手机灭屏显示时间怎么设置p30)

  • 如何安装触宝电话(下载免费触宝电话并安装)

    如何安装触宝电话(下载免费触宝电话并安装)

  • 微信视频连接中连不上(微信视频连接中断什么意思)

    微信视频连接中连不上(微信视频连接中断什么意思)

  • nvm安装步骤及使用方法(nvm使用教程)

    nvm安装步骤及使用方法(nvm使用教程)

  • DINO 论文精度,并解析其模型结构 & DETR 的变体(精读论文分析)

    DINO 论文精度,并解析其模型结构 & DETR 的变体(精读论文分析)

  • php算法面试题有哪几种(php算法面试题有答案吗)

    php算法面试题有哪几种(php算法面试题有答案吗)

  • 应交增值税和未交增值税都有余额
  • 我国增值税征收范围
  • 同级财政拨款的管理要求有哪些
  • 未开票收入如何填写增值税申报表
  • 工程施工与工程结算在资产负债表里
  • 个体户和公司的经营范围有区别吗
  • 企业按照行业分类为
  • 银行承兑汇票背书可以拆分
  • 建筑业工人工资保障
  • 房产企业贷款利率
  • 专项用途财政资金纳税调整规则
  • 没收到发票可以做成本吗
  • 不动产增值税怎么算
  • 免抵退税额抵减额是什么意思
  • 股权转让收益算利润吗
  • 工资表是放在计提还是发放
  • 固定资产加速折旧最新政策2023
  • 小规模季度划分
  • 金融服务收入怎么算
  • 三金一费包括哪些
  • 车辆购置税通过应交税费吗
  • 保证金计入哪个会计科目
  • 上报汇总完成,远程清卡清不了
  • 收到采购折扣的账务处理
  • 管理会计完全成本法和变动成本法例题
  • 账外资产评估入账固定资产折旧可以税前扣除吗?
  • windows10无法打开此类型的文件(.exe)
  • 个人独资企业公账转私账
  • stk al00华为
  • php 字符串函数
  • 固定资产出租需交什么税
  • php web3
  • 工程款清欠管理办法
  • 赠送现金券是否违法
  • 企业所得税税前扣除凭证管理办法
  • 深红玫瑰鹦鹉多钱一个
  • 黑白相间表带
  • php调用外部程序
  • 结转生产成本的会计科目
  • 出口退税无纸化备案怎么弄
  • php微信公众号开源框架
  • 深度卷积神经网络基本结构
  • 普通发票可以跨年报销吗
  • Google C++ Style中允许使用的Boost库(1) 程序即人生 博客频道 CSDN.NET
  • css中字符间距怎么设置
  • 织梦自定义字段
  • 冲以前年度管理费用
  • 审计符合性测试
  • 待报解预算收入是什么意思,扣了钱
  • 差额征税的专用发票能抵扣吗
  • centos彻底删除文件
  • 库存现金月末是怎么样结账的
  • 个体户查账征收和核定征收哪个好
  • 私企固定资产报废程序
  • 以前年度少计费用,调整分录
  • 营改增后房地产企业如何开票
  • 商品盘点短缺
  • 定期存款账务怎么处理
  • 小企业无形资产取得的账务处理
  • 跨月的发票还能入账吗
  • 车辆购置税计入税金及附加吗
  • 生产经营年度汇算清缴
  • 企业入库申报什么意思
  • 增值税抵扣可以完全抵扣吗
  • 哪些工资属于社会福利
  • 收不回来的其他应收账款如何处理?
  • 苹果电脑安全性
  • 64位win7怎么释放为硬件保留的内存?
  • Yosemite使用技巧 如何使用Yosemite mac信息功能共享电脑屏幕教程
  • linux中如何更改主机名
  • linux怎么使用
  • django应用开发实战
  • js中面向对象编程
  • android studio的app
  • 全国税务系统12366纳税服务热线工作规范
  • 浙江省工会经费减免最新政策2019年
  • 山东地方税务局官网
  • 盐城买家电到哪里买
  • 江西省抚州市黎川县洵口镇
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设