【学习笔记】Vue3源码解析:第五部分 - 实现渲染(1)

课程地址:【已完结】全网最详细Vue3源码解析!(一行行带你手写Vue3源码)

第五部分-:(对应课程的第29-32节)

第29节:《实现渲染的createRender方法》

在这里插入图片描述

1、通过createApp()方法得到一个对象app,打印出来观察:发现 app 是一个对象,这个对象上面有很多属性,其中,mount是用来挂载的,provide是用来提供数据的,use是用来使用插件的:

在这里插入图片描述
在这里插入图片描述

2、在自己的工程中,7.createApp.html 文件中,编写如下代码:

在这里插入图片描述

3、在 runtime-dom 文件夹的入口文件中来实现 createApp 方法,它返回一个 app 对象,这个app对象上有一个mount方法,mount方法接收一个container容器,在这个方法中先清空这个container容器中的原有内容:

在这里插入图片描述

将选择dom元素的方法替换为我们之前写好的方法:

在这里插入图片描述

在这里插入图片描述

将创建app对象的过程写成另一个方法 createRender ,它接收我们写好的操作 dom 的一系列方法——为什么要把这些操作dom的方法单独出去,并在这里作为参数传递进去?因为在不同的平台运行代码时,不同平台操作dom的方式是不同的,所以需要单独写,并通过传参的形式传入。

在这里插入图片描述

在这里插入图片描述

这个 createRender 方法返回一个对象,这个对象上有一个createApp属性,它是一个方法,它接收我们传递给外层的createApp 方法的两个参数,即 rootComponent 和 rootProps ,返回一个app对象,这个对象上有一个mount方法。这里的createRender 方法相当于一个高阶函数。

定义 createRender 方法:

在这里插入图片描述

在这里插入图片描述

第30节:《创建虚拟dom》

1、将 createRender 方法剪切,放到 runtime-core/src 下新建的 render.ts 文件(源码中是renderer.ts文件)中并暴露出去:

在这里插入图片描述

2、在 runtime-core/src 下的入口文件index.ts 中引入 createRender 并暴露出去:

在这里插入图片描述

3、在 runtime-dom/src 下的入口文件index.ts 中引入 createRender 之前,由于我们之前配置的npm run dev 打包是只打包 runtime-dom 包,所以需要运行 npm run build 将所有的包都打包一下。然后运行 yarn install 重新安装一下,完成之后 node_modules 下的 @vue 下才会有 runtime-core 这个包:

在这里插入图片描述

4、在 runtime-dom/src 下的入口文件index.ts 中引入 createRender :

在这里插入图片描述

5、在render.ts 文件中添加如下代码:

在这里插入图片描述

6、在 runtime-core/src 下新建 apiCreateApp.ts 文件,将 render.ts 中的 createApp方法抽离到apiCreateApp.ts 文件中并暴露:

在这里插入图片描述

7、为了使 apiCreateApp.ts 文件中的createApp方法能够使用 render.ts 中的 render 函数,在render.ts中引入 apiCreateApp.ts 中暴露的 apiCreateApp 方法,并传递 render :

在这里插入图片描述

8、apiCreateApp.ts 文件中,这个方法主要是用来创建虚拟dom 也就是 vnode 的:

在这里插入图片描述

9、添加如下代码:

在这里插入图片描述

在这里插入图片描述

10、新建 vnode.ts 文件:

在这里插入图片描述

在这里插入图片描述

打印出来的参数就是在这里传进去的两个参数:组件和数据

在这里插入图片描述

10、由于创建虚拟dom有两种方式,一种是通过这个createVnode方法,一种是通过h函数,通过h函数最终也是会走createVnode方法,为了兼容两种方法的传参,将createVnode的方法入参改为如下,同时在方法内部进行区别是组件还是元素(通过createVnode方法传递进来的第一个参数,就是如上张截图中的第一个参数,也就是一个组件;而通过h函数传递的第一个参数,会是一个节点名称,如’div’):

在这里插入图片描述

使用 shapeFlag 字段标识是组件还是元素,并创建 vnode 对象:

在这里插入图片描述

第32节:《区分是组件还是元素》

1、查看源码工程中 shared下的 shapeFlags 枚举值,是用位表示的:
在这里插入图片描述

在这里插入图片描述

2、来到我们自己的工程,shared/src下新建 shapeFlag.ts 文件(源码中为shapeFlags.ts ),将源码中该文件的内容复制过来,并在shared的入口文件中导入并全部暴露:

在这里插入图片描述

3、在 vnode.ts 中添加代码:

在这里插入图片描述

4、继续添加如下代码:

(这里的位运算以及位运算符 & 与 | 不太懂,待补充相关知识 )

在这里插入图片描述

在这里插入图片描述

5、测试打印vnode:

在这里插入图片描述
在这里插入图片描述

第32节:《总结知识点》

基本就是前两节的一个总结

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI热潮下,公链基础设施赛道都有哪些变化?

最近在一级市场,最火热的赛道无疑是AI,其次是BTC,每天聊的项目80%都集中在这两个赛道,我个人最多的时候一天可以聊5,6个AI项目。 可以预见的是AI泡沫会在明后年达到顶峰,随着数以百计的AI新项目上线&#…

QT实现客户端断开连接

Widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), socket(new QTcpSocket(this)) {ui->setupUi(this);//初始化界面ui->msgEdit->setEnabled(false); //不可用ui-…

SQL Server Management Studio 显示行号

前言 在使用 SQL Server Management Studio (SSMS) 进行数据库管理和查询时,能够看到代码的行号是非常有用的。这可以帮助您更容易地定位代码错误、讨论特定的代码行,或者在执行长查询时快速找到特定行。在本文中,我将向您展示如何在 SSMS 中…

AIDE:自动驾驶目标检测的自动数据引擎

AIDE:自动驾驶目标检测的自动数据引擎 摘要IntroductionRelated WorksMethodData FeederModel Updater4 Experiments 摘要 自动驾驶车辆(AV)系统依赖于健壮的感知模型作为安全保证的基石。然而,道路上遇到的物体表现出长尾分布&a…

图像生成模型浅析(Stable Diffusion、DALL-E、Imagen)

目录 前言1. 速览图像生成模型1.1 VAE1.2 Flow-based Model1.3 Diffusion Model1.4 GAN1.5 对比速览 2. Diffusion Model3. Stable Diffusion3.1 Text Encoder3.2 Decoder3.3 Generation Model 总结参考 前言 简单学习下图像生成模型的相关知识🤗 以下内容来自于李宏…

vue3+elment复杂详情页面打开后,再打开其他页面都显示空白,控制台也没什么特殊报错

页面使用了el-tabs 、 el-tab-pane、el-table 等标签 但是经测试不是这些问题导致的 js也使用了onMounted ,但是除掉也时空白页面 反正之前人写的页面可乱,尤其是js这块,穿插引用import一大堆 主题页面样式布局如下 最后看到页面代码太乱…

古籍数字化平台:精校功能介绍

一、平台介绍 古籍数字化平台,本着公益性、低成本、合作共赢的三大原则,功能涵盖古籍OCR识别、族谱县志OCR识别、民国报纸OCR识别、图文逐字校对、数据著录、智能标点分段、精编排版、智能白话译文等,是一站式线上整理全流程平台。 平台集成…

备战面试K8S

备战面试&&K8S Kubernetes关于DockerDocker的优缺点分析 WebAssemblyWebAssembly与Container比较 CtrCrictlCtr和CriCtl的区别 Pod生命周期PodConditions容器状态Pod容器组成生命周期的流程 Kubelet EFK日志采集工具的优缺点 Kubernetes 容器运行接口 Container Runti…

2024年免费云服务器推荐,小编亲测好用!

随着云计算技术的飞速发展,云服务器以其弹性、高效、安全的特性,成为众多企业和个人用户的首选。尽管市面上有众多收费的云服务器产品,但免费的云服务器仍然吸引着大量用户,尤其是初学者和预算有限的用户。下面,我们就…

从API到Agent:洞悉LangChain工程化设计

作者:范志东 原文:https://mp.weixin.qq.com/s/zGS9N92R6dsc9Jk57pmYSg 本文作者试着从工程角度去理解LangChain的设计和使用。大家可以将此文档作为LangChain的“10分钟快速上手”手册,希望帮助需要的同学实现AI工程的Bootstrap。 我想做一…

[Vision Board创客营]学习片上Flash移植FAL

文章目录 [Vision Board创客营]学习片上Flash移植FAL介绍环境搭建使用组件测试porbeerasewriteread 结语 [Vision Board创客营]学习片上Flash移植FAL 水平较菜,大佬轻喷。😰😰😰 介绍 🚀🚀Vision-Board 开…

安全开发实战(3)--存活探测与端口扫描

目录 安全开发专栏 前言 存活探测 端口扫描 方式一: 1.3.1 One 1.3.2 Two 1.3.3 批量监测 方式二: 1.3.1 One 1.3.2 Two 1.3.3 Three 1.3.4 扫描ip地址,提取出开放端口和协议 ​编辑 1.3.5 批量扫描(最终完成版) 总结 安全开发专栏 安全开发实战​http://t.csd…

MySql数据库从0-1学习-第五天事务和索引

事务 事务 是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。 注意事项,默认事务是自动提交的,也就是说,当执行一条DML语句,MySql会立即隐…

【Java开发指南 | 第八篇】Java变量、构造方法、创建对象

读者可订阅专栏:Java开发指南 |【CSDN秋说】 文章目录 Java变量构造方法创建对象 Java变量 在Java中,变量用于存储数据值。它们是程序中用于保存信息的一种基本方式。变量在程序执行过程中可以被赋予不同的值,并且这些值可以在程序的不同部分…

超越现实的展览体验,VR全景展厅重新定义艺术与产品展示

随着数字化时代的到来,VR全景展厅成为了企业和创作者展示作品与产品的新兴选择。通过结合先进的虚拟现实技术,VR全景展厅不仅能够提供身临其境的观展体验,而且还拓展了传统展示方式的界限。 一、虚拟现实技术的融合之美 1、高度沉浸的观展体验…

Unity开发holoLens2应用时的ProjectSettings配置

正确的进行Unity工程配置,才能进行后续的【发布】和【部署】操作… 本案例开发环境说明: Unity2021.3.18Win10VS2022HoloLens2 一、平台设置 二、Quality画面质量设置 三、Player玩家设置 四、XR-Plug设置 五、环境测试 导入一个官方demo&#xff0c…

EasyPoi表格导入添加校验

EasyPoi表格导入添加校验 项目添加maven依赖实体类自定义校验controller测试结果 代码地址 项目添加maven依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www…

【任务调度】Apache DolphinScheduler快速入门

Apache DolphinScheduler基本概念 概念&#xff1a;分布式、去中心化、易扩展的可视化DAG工作流任务调度系统。 作用&#xff1a;解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。Apache DolphinScheduler是一款开源的调度工具&#xff…

紫光展锐携手中国联通智慧矿山军团(山西)完成RedCap现网环境测试

近日&#xff0c;紫光展锐与中国联通智慧矿山军团&#xff08;山西&#xff09;在现网环境下成功完成了RedCap技术测试。此次测试对搭载紫光展锐RedCap芯片平台V517的模组注网速度和信号情况、Iperf打流测试上下行情况、ping包延时情况以及模组拨号入网压测等项目进行了全面验证…

OpenHarmony UI动画-rebound

简介 rebound是一个模拟弹簧动力学&#xff0c;用于驱动物理动画的库。 下载安装 ohpm install ohos/reboundOpenHarmony ohpm环境配置等更多内容&#xff0c;请参考如何安装OpenHarmony ohpm 使用说明 import rebound from ohos/rebound;功能一&#xff1a;创建维护弹簧对…