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

  • 代扣代缴个人所得税会计分录怎么做
  • 耕地占用税中的耕地是指什么
  • 税负率的计算公式举例说明
  • 税务是怎么回事
  • 挂靠到运输公司的车转让给个人如何交增值税
  • 增值税优惠政策3%降1%
  • 企业稳岗补贴怎么查
  • 滴滴代叫乘客有没有事
  • 自然灾害导致的车损可以理赔嘛
  • 董事费监事费个税计算
  • 收到社保中心的生育经贴怎么做账
  • 退货款现金流量表填经营活动的什么科目
  • 合同副本和正本区别
  • 小规模纳税人税率有几种
  • 商品房买卖合同预售和商品房买卖合同有什么区别
  • 基金公司管理费收入怎么入账
  • 建筑公司不需要预缴增值税的有
  • 研发费用税点是什么意思
  • 其他应付款余额在借方表示什么意思
  • 防伪税控技术维护费是进项还是销项
  • 房地产企业预付账款为负数
  • 以前年度的费用可以入在当年吗?
  • 专用发票和普通发票的税率
  • 享受免税的企业每月直接零申报吗
  • 用人单位逾期未缴纳社会保险费可能会使用的文书
  • win10 2004 2009
  • 计提跌价准备会影响利润吗
  • 固定资产报废如何计算
  • 长期待摊费用属于什么要素
  • windows10右键刷新有点卡
  • 销售折让负数发票如何入账
  • PHP:Memcached::deleteMultiByKey()的用法_Memcached类
  • macOS Big Sur 11.2 公测版 beta 1怎么更新?
  • 缴纳季度企业所得税比例
  • devtools无法加载源映射less.map
  • php基于正则批量输出
  • torch训练模型
  • 车辆购置税发票图片
  • 业务招待费会计和税法差异
  • 前端如何将项目分类
  • vue的路由跳转了,可是页面没有变化
  • vue修饰词
  • 劳务派遣开具发票
  • Python运算符的优先级别
  • 网商贷企业贷款条件
  • 投资理财产品的骗术
  • 周转材料低值易耗品怎么结转
  • 小微企业所得税税率
  • 费用分割单使用范围
  • 被投资公司注销,投资收益需要交企业所得税你吗
  • 公司成立怎么说
  • 招待费和差旅费的区别
  • 职工薪酬包括哪些应如何计算
  • 固定资产报废如何记账
  • 新公司办公室装修费怎么记账
  • 企业办增项怎样办理
  • 新成立的公司都是小微企业吗
  • mysql启动错误1067 进程意外终止
  • 在centOS 7安装mysql 5.7的详细教程
  • win8怎么设置指纹
  • win打开本地策略
  • 红帽子一个月能挣多少钱
  • macos卸载java
  • 加载的读音
  • win7自动升级失败后的处理
  • 电脑自带的groove音乐用不了
  • xtemplate node.js 的使用方法实例解析
  • 前端面试题及答案2023vue3
  • js基于什么
  • android 实例
  • unity引擎工具
  • 简述javascript
  • python约瑟夫问题最高效算法
  • 可分割项目
  • 悬浮工具栏
  • 开票物品名称要求
  • 怎么查询工程师名下的项目
  • 江苏地方税务局2013招考公告
  • 船舶税由谁代征
  • 房子的地税发票丢了怎么补办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设