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

  • 税务机关代码怎样查询
  • 工商注册经营部和公司的区别
  • 个人出租商用房税率
  • 税负怎么计算
  • 餐饮业厨房设备专票可以抵税吗
  • 向投资者分配的现金股利如何做账
  • 上缴非税收入前是否要交税
  • 个税0申报漏了2年可以补报
  • 附加税减半征收会计分录
  • 股权转让1元转让
  • 非税项目明细代码
  • 印花税核定征收的计税依据
  • 增值税发票在邮寄途中丢了怎么办
  • 接受现金捐赠怎么写分录
  • 票据行为为什么没有付款
  • 出口货物如果没收怎么办
  • 公司账上收到退回的多交的附加税怎么做
  • 商品和服务税收编码怎么查
  • 收到政府拨款怎么做账
  • 取得高新技术企业
  • 股权激励取消怎么处理?
  • 公司支付的赔偿款计入什么会计科目
  • 加油站的成品油经营许可证过期3个月还能换证吗?
  • 增值税的滞纳金是多少
  • 制作flash动画步骤
  • 挂账多年的往来账怎么处理
  • 补交之前年度税款怎么调账
  • 资金性质是什么有哪些方面
  • python中各种颜色
  • 劳务报酬可以扣除合理支出吗
  • 时间序列转换
  • 小微企业所得税税收优惠政策2023年
  • element级联动态加载
  • 什么是微前端
  • PHP magento后台无法登录问题解决方法
  • 企业收到土地回收怎么办
  • 城镇土地使用税优惠政策
  • 代开发票是否代征城建税和教育费附加?
  • 电脑耗材发票税点多少
  • 建筑施工企业增值税税率调整时间
  • java守护线程和普通线程jvm区别
  • 分公司要所得税汇算吗
  • 资产负债表递延所得税资产计算公式
  • sql server添加语句
  • sqlserver数据库和mysql区别
  • 发票领购簿用完了怎么领取
  • 支付宝收付款如何截图
  • 业务招待费报销制度及流程
  • 简易征收的税款可以抵减
  • 劳务公司账务处理实例
  • 未确认融资费用借贷方向
  • 商品流通企业应交那些税费
  • 国际结算手续费收入增值税
  • 企业计提福利费按多少提
  • 一般纳税人网上申报流程
  • 财税2009年87号文废止
  • 专用发票怎么入账
  • 工会经费按实际发放交还是以计提的
  • 债权人接受债务人土地抵押,还会被其他债权人查封?
  • 卸载软件怎么彻底删掉
  • sql多表连接查询(详细实例)
  • win10禁用系统uac
  • mac上怎么截图
  • ubuntu查看内存占用最多的进程ID
  • ubuntu设置共享文件夹命令mount
  • win10更新中重启会怎么样
  • win7控制面板找不到windows update
  • win10系统故障恢复
  • [置顶]电影名字《收件人不详》
  • 下载随手调
  • Node.js中的核心模块包括哪些内容?
  • nodejs实现HTTPS发起POST请求
  • 什么绑定什么服务
  • js函数的声明方式
  • Javascript Objects详解
  • 如何理解js的面向对象
  • 宁夏电子税务局登录入口
  • 湖北耕地占用税标准
  • 东莞税收突破2000亿
  • 山东省国税网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设