【Vue3源码学习】— CH3.2 VNode解析(上)

VNode解析—上

  • 1. VNode 的作用和优势
    • 1.1 抽象表示
    • 1.2 更新优化
    • 1.3 跨平台
  • 2. _createVNode 函数解析
    • 2.1 调用链路
    • 2.2 _createVNode函数实现
      • 关键操作说明:
      • 注1:
      • 注2:
    • 2.3 _createVNode小结
  • 3. createBaseVNode 详解
    • 3.1 源码解析
    • 3.2 关键部分解析
    • 3.3 类型说明
      • 3.3.1 ts | 符号
      • 3.3.2 解释 VNodeTypes
    • 3.4 示例

在 Vue 3 中,VNode(虚拟节点)是框架内部用于表示真实 DOM 结构的 JavaScript 对象。VNode 使得 Vue 能够在不直接操作 DOM 的情况下,通过比较新旧 VNode 来决定是否需要更新 DOM。这种机制提高了渲染性能,并简化了数据与视图之间的同步过程。

1. VNode 的作用和优势

1.1 抽象表示

VNode 是对真实 DOM 的抽象表示,允许 Vue 在内存中操作 DOM 结构,而无需直接与真实 DOM 交互,从而提高效率。

1.2 更新优化

通过对比新旧 VNode,Vue 可以确定哪些部分需要更新,避免不必要的 DOM 操作,优化渲染性能。

1.3 跨平台

VNode 机制使得 Vue 不依赖于特定平台的 DOM 实现,支持如服务器端渲染(SSR)、原生应用(如通过 Vue Native 或 Weex)等跨平台应用。

2. _createVNode 函数解析

_createVNode 是 VNode 创建过程中的核心函数,负责根据输入参数生成 VNode 对象。以下是 _createVNode 的调用链路和详细解析:

2.1 调用链路

当 Vue 应用的 .mount() 方法被调用时,它首先通过 createVNode 函数创建根组件的 VNode:

//apiCreateApp.ts
const vnode = createVNode(rootComponent, rootProps)//vnode.ts
export const createVNode = (__DEV__ ? createVNodeWithArgsTransform : _createVNode
) as typeof _createVNode

createVNode 函数根据环境配置决定具体的实现,生产环境下直接使用 _createVNode。

2.2 _createVNode函数实现

_createVNode 主要执行以下操作:

function _createVNode(type: VNodeTypes | ClassComponent | typeof NULL_DYNAMIC_COMPONENT,props: (Data & VNodeProps) | null = null,children: unknown = null,patchFlag: number = 0,dynamicProps: string[] | null = null,isBlockNode = false,
): VNode {/*** 检查 type 是否有效。* 如果不是有效的节点类型,将 type 设置为 Comment(注释节点),用于表示无效或空节点。*/if (!type || type === NULL_DYNAMIC_COMPONENT) {if (__DEV__ && !type) {warn(`Invalid vnode type when creating vnode: ${type}.`)}type = Comment}/*** 处理传入的 VNode 类型,如果是已存在的 VNode对象,则克隆这个 VNode,并根据需要合并引用和处理子节点。*/if (isVNode(type)) {// createVNode receiving an existing vnode. This happens in cases like// <component :is="vnode"/>// #2078 make sure to merge refs during the clone instead of overwriting itconst cloned = cloneVNode(type, props, true /* mergeRef: true */)if (children) {normalizeChildren(

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索Java设计模式:命令模式

深入理解与实践Java设计模式之命令模式 一、简要介绍 命令模式&#xff08;Command Pattern&#xff09;是一种行为型设计模式&#xff0c;它将请求封装为一个对象&#xff0c;使得使用命令对象的客户端与请求接收者&#xff08;即具体执行命令的对象&#xff09;解耦。这样做…

只需几步,即可享有笔记小程序

本示例是一个简单的外卖查看店铺点菜的外卖微信小程序&#xff0c;小程序后端服务使用了MemFire Cloud&#xff0c;其中使用到的MemFire Cloud功能包括&#xff1a; 其中使用到的MemFire Cloud功能包括&#xff1a; 云数据库&#xff1a;存储外卖微信小程序所有数据表的信息。…

【linux】软件工具安装 + vim 和 gcc 使用(上)

目录 1. linux 安装软件途径 2. rzsz 命令 3. vim 和 gcc 使用 a. vim的基本概念 b. 命令模式下的指令 c. 底行模式下的指令 1. linux 安装软件途径 源代码安装rpm安装 -- linux安装包yum安装&#xff08;最好&#xff0c;可以解决安装源&#xff0c;安装版本&#xff0…

0418WeCross搭建 + Caliper测试TPS

1. 基本信息 虚拟机名称&#xff1a;Pure-Ununtu18.04 WeCross位置&#xff1a;/root/wecross-demo 2. 搭建并启动WeCross 参考官方指导文档 https://wecross.readthedocs.io/zh-cn/v1.2.0/docs/tutorial/demo/demo.html 访问WeCross网页管理平台 http://localhost:8250/s/…

【Java框架】Spring框架(六)——Spring中的Bean的作用域

目录 Bean的作用域1.singleton(默认)代码示例 2.prototype代码示例 3.request代码示例 4.session代码示例 5.application代码示例 websocket Bean的作用域 Spring支持6个作用域&#xff1a;singleton、prototype、request、session、application、websocket 1.singleton(默认…

python基础知识二(标识符和关键字、输出、输入)

目录 标识符和关键字&#xff1a; 什么是标识符&#xff1f; 1. 标识符 2. 标识符的命名规则 什么是关键字&#xff1f; 1. 关键字 2. 关键字的分类 标识符和关键字的区别&#xff1a; ​​​输出&#xff1a; 1. 普通的输出 2. 格式化输出 格式化操作的目的&#…

Pycharm破解流程

1.下载pycharm 网上很多&#xff0c;随便找一个&#xff0c;懒得找的话&#xff0c;或者去我传上去的资源pycharm部分直接取 2.下载文件 文件部分&#xff0c;我放在pycharm文件里面一起 打开下载好的激活包 3.执行脚本 先执行unisntall-all-users.vbs,直接双击打开&#xff0c…

LeetCode刷题--- 完全平方数

前言&#xff1a;这个专栏主要讲述动态规划算法&#xff0c;所以下面题目主要也是这些算法做的 我讲述题目会把讲解部分分为3个部分&#xff1a; 1、题目解析 2、算法原理思路讲解 3、代码实现 完全平方数 题目链接&#xff1a;完全平方数 题目 给你一个整数 n &#x…

牛客网华为机试题说明一

一. 简介 对牛客网华为机试题进行一下记录。 二. 牛客网华为机试题 1. 字符串最后一个单词的长度 题目说明 计算字符串最后一个单词的长度&#xff0c;单词以空格隔开&#xff0c;字符串长度小于5000。 &#xff08;注&#xff1a;字符串末尾不以空格为结尾&#xff09; 输…

Springboot AOP接口防刷、防重复提交

Java利用注解、Redis做防重复提交和限流 使用场景 用户网络慢&#xff0c;电脑卡&#xff0c;一直点击保存&#xff0c;修改按钮无返回信息&#xff0c;会导致多个请求去保存、修改 开放接口、或加密接口频繁访问&#xff0c;会导致程序压力大&#xff0c;可能被他人写脚本一直…

L2-048 寻宝图(PTA)

文章目录 L2-048 寻宝图题目描述bfs踩到的坑 L2-048 寻宝图 题目描述 给定一幅地图&#xff0c;其中有水域&#xff0c;有陆地。被水域完全环绕的陆地是岛屿。有些岛屿上埋藏有宝藏&#xff0c;这些有宝藏的点也被标记出来了。本题就请你统计一下&#xff0c;给定的地图上一共…

Godot3D学习笔记1——界面布局简介

创建完成项目之后可以看到如下界面&#xff1a; Godot引擎也是场景式编程&#xff0c;这里的一个场景相当于一个关卡。 这里我们点击左侧“3D场景”按钮创建一个3D场景&#xff0c;现在在中间的画面中会出现一个球。在左侧节点视图中选中“Node3D”&#xff0c;右键创建子节点…

企业车辆管理系统平台是做什么的?

企业车辆管理系统平台是一种综合性的管理系统&#xff0c;它主要集车辆信息管理、车辆调度、车辆维修、油耗管理、驾驶员管理以及报表分析等多种功能于一体。通过这个平台&#xff0c;企业可以实现对车辆的全面管理&#xff0c;优化车辆使用效率&#xff0c;降低运营成本&#…

在Windows 10中禁用Windows错误报告的4种方法,总有一种适合你

序言 在本文中&#xff0c;我们的主题是如何在Windows 10中禁用Windows错误报告。你知道什么是Windows错误报告吗&#xff1f;事实上&#xff0c;Windows错误报告有助于从用户的计算机收集有关硬件和软件问题的信息&#xff0c;并将这些信息报告给Microsoft。 它将检查任何可…

基于postCSS手写postcss-px-to-vewiport插件实现移动端适配

&#x1f31f;前言 目前前端实现移动端适配方案千千万&#xff0c;眼花缭乱各有有缺&#xff0c;但目前来说postcss-px-to-vewiport是一种非常合适的实现方案&#xff0c;postcss-px-to-vewiport是一个基于postCss开发的插件&#xff0c;其原理就是将项目中的px单位转换为vw(视…

CSS 常用样式

1.a 链接,鼠标光标为手指 cursor 属性规定要显示的光标的类型&#xff08;形状&#xff09;。 a {cursor: pointer;/*手指形态,可以指定图片*/ }2. div 文本超出长度&#xff0c;为省略号&#xff0c;悬浮文本上面显示全部文字 <div class"overflow-text">这…

day07 51单片机-18B20温度检测

18B20温度检测 1.1 需求描述 本案例讲解如何从18B20传感器获取温度信息并显示在LCD上。 1.2 硬件设计 1.2.1 硬件原理图 1.2.3 18B20工作原理 可以看到18B20有两根引脚负责供电,一根引脚负责数据交换。18B20就是通过数据线和单片机进行数据交换的。 1)18B20工作时序 2)…

Leetcode-69.x的平方根

题目描述 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 …

node.js-模块化

定义&#xff1a;CommonJS模块是为Node.js打包Javascript代码的原始方式。Node.js还支持浏览器和其他Javascript运行时使用的ECMAScript模块标准。 在Node.js中&#xff0c;每个文件都被视为一个单独的模块。 概念&#xff1a;项目是由很多个模块文件组成的 好处&#xff1a…

文件流详细介绍

文件流 使用IO操作文件时&#xff0c;要注意流关闭和释放问题! FileAccess&#xff0c;访问权限(只读&#xff0c;只写&#xff0c;可读可写) 1&#xff09;FileAccess.Read&#xff1a; 用法&#xff1a;获得对文件的读取访问权限&#xff0c;进而可以从文件中读取数据(只读)…