【学习笔记】Vue3源码解析:第四部分- runtime-dom(1)

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

第四部分-:(对应课程的第24-26节)

第24节:《理解runtime-dom的作用》

在这里插入图片描述

源码中除了 dep.ts ,其余基本都讲到了:

在这里插入图片描述

runtime-core、runtime-dom是代码在浏览器中运行时处理的:

在这里插入图片描述

1、在源码工程中,找到scripts下的dev.js文件,修改下图处的 vue 为 runtime-dom:

在这里插入图片描述

在这里插入图片描述

2、然后运行:npm run dev

在这里插入图片描述

3、打包完成后 runtime-dom文件夹下会生成一个 dist 文件:

在这里插入图片描述

4、在 packages/vue/examples 文件夹下新建 8.createApp.html ,在其中编写代码:

在这里插入图片描述

此时页面效果为:

在这里插入图片描述

5、render函数接收到的第一个参数,会将该组件中所有的属性合并成一个对象,即这个参数,render函数中的this指向当前的组件对象,它不像vue2中的this是一个实例对象。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

在render函数中以 proxy.a 的形式读取data中的数据:

在这里插入图片描述

在这里插入图片描述

vue3中可以兼容vue2中的data、methods等配置项(注释的内容),但我们一般不这样去写

在这里插入图片描述

vue3中,应该在setup中写数据、方法等逻辑。setup函数相当于vue2中的 beforeCreate 和 created,页面加载时它只执行一次。它有props和context两个参数,它的返回值可以是一个对象,也可以是一个函数。在render函数中以 proxy.state.age 形式访问setup返回的数据:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

不再在render函数中返回了,直接在setup函数中返回一个函数:这个函数返回 h函数的执行结果:

在这里插入图片描述

给 h 函数中要渲染的div 绑定click事件:

在这里插入图片描述

点击时可以实现相应效果:

在这里插入图片描述

第26节:《创建操作节点的增删改查的方法》

来到自己的工程:

1、在packages文件夹下新建 runtime-dom 与 runtime-core 两个文件夹,在每个文件夹下分别新建src文件夹,并在src文件夹下新建 index.ts 入口文件:
在这里插入图片描述

2、分别进入 runtime-dom 与 runtime-core 两个文件夹,分别在其中运行 npm init -y ,生成各自的packages.json文件:

在这里插入图片描述

3、将 reactivity 文件夹里的package.json 配置文件中的 buildOptions 配置项粘贴到 runtime-dom 下的package.json 文件中,并将 name 配置项改为如下图;buildOptions中的name改为 VueRuntimeDom,删掉 cjs :

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

4、 来到 runtime-core 下的package.json 文件中,修改为如下。由于 runtime-core 中是核心方法,打包只需要global格式的就可以了:

在这里插入图片描述

5、scripts下的 dev.js 文件中,修改打包目标文件 build(‘reactivity’) 为 build(‘runtime-dom’) :

在这里插入图片描述

6、在runtime-dom/src/indexts 中写一些测试代码,如下,不然打包空文件可能报错:

let a = 100
export {
	a
}

运行 npm run dev ,成功后 runtime-dom 文件夹下生成了dist 文件夹,其中生成了相应的打包文件:

在这里插入图片描述

7、在 runtime-dom/src 下新建 nodeOps.ts 文件与 patchProp.ts 文件,nodeOps.ts 是用来操作dom的,patchProp.ts 是用来操作属性的。在nodeOps.ts 文件中编写操作dom的方法:

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

nodeOps.ts 文件中编写的所有操作属性与文本的方法如下:

在这里插入图片描述

第26节:《使用策略模式操作属性》

1、在 patchProp.ts 中添加如下代码:暴露一个patchProps 方法,它接收4个参数,分别是:el代表元素,如div;key代表元素的属性,如 class、style、自定义属性等;prevValue代表旧的值,nextValue代表新的值:

在这里插入图片描述

2、在 runtime-dom/src 下新建 modules 文件夹,其下新建如下4个ts文件:

在这里插入图片描述

3、在 class.ts 文件中增加如下逻辑:如果新渲染的元素的class,即value参数为空,那么直接将上一次渲染的元素的class值清空;如果新渲染的元素的class,即value参数有值,那么直接覆盖元素的class,使其为最新的class值:

在这里插入图片描述

4、 patchProp.ts 增加如下代码:

在这里插入图片描述

5、在 style.ts 文件中增加如下代码:如果新渲染的元素的style无值,则将原来的style值清除;如果新渲染的元素的style有值,style是一个对象的形式,此时再判断老的style中的key,在新的style对象中是否存在,如果不存在直接清除style对象的这个属性;然后再将新的style对象中的属性,遍历赋值到元素的style对象中去:

在这里插入图片描述

在这里插入图片描述

6、 patchProps.ts 中继续增加如下代码:通过正则匹配是不是事件属性,如果是则执行patchEvent方法,如果不是则执行patchAttr方法:

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

设计模式——备忘录模式18

备忘录模式将创建状态快照 /备份的工作委派给实际状态的拥有者 (Originator) 对象。 这样其他对象就不再需要从 “外部” 复制文件状态了, 拥有者拥有其文件状态的完全访问权, 因此可以自行生成快照。 设计模式,一定要…

Linux-时间同步服务器

1. (问答题) 一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 编写脚本文件 #!/bin/bash hostnamectl hostname ntp_server.example.com cd /etc/NetworkManager/system-connections/ rm -fr * cat > eth0.nmconnection <&…

SpringBoot相关知识点总结

1 SpringBoot的目的 简化开发&#xff0c;开箱即用。 2 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中的一个重要概念&#xff0c;它是一种提供依赖项的方式&#xff0c;可以帮助开发人员快速集成各种第三方库和框架。Spring Boot Starter 的目的是简化 Sprin…

【架构-14】数据库性能优化方式

数据库出现性能瓶颈对外的表现为&#xff1a; 大量请求阻塞SQL操作变慢存储出现问题 为解决上述出现的问题&#xff0c;因此推出了一系列的数据库性能优化方式。 数据库性能优化是提高数据库系统性能和响应时间的关键任务。以下是一些常见的 数据库性能优化方式&#xff1a; …

力扣152. 乘积最大子数组

Problem: 152. 乘积最大子数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化&#xff1a;首先&#xff0c;我们创建两个数组maxNum和minNum&#xff0c;并将它们初始化为输入数组nums。这两个数组用于存储到当前位置的最大和最小乘积。我们还需要一个变量maxProduc…

51单片机之DS1302实时时钟

1.DS1302时钟芯片介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能RTC(Real Time Clock)&#xff1a;实时时钟&#xff0c;是一种集成电路&#xff0c;通常称…

HTML段落标签、换行标签、文本格式化标签与水平线标签

目录 HTML段落标签 HTML换行标签 HTML格式化标签 加粗标签 倾斜标签 删除线标签 下划线标签 HTML水平线标签 HTML段落标签 在网页中&#xff0c;要把文字有条理地显示出来&#xff0c;就需要将这些文字分段显示。在 HTML 标签中&#xff0c;<p>标签用于定义段落…

【前端】1. HTML【万字长文】

HTML 基础 HTML 结构 认识 HTML 标签 HTML 代码是由 “标签” 构成的. 形如: <body>hello</body>标签名 (body) 放到 < > 中大部分标签成对出现. <body> 为开始标签, </body> 为结束标签.少数标签只有开始标签, 称为 “单标签”.开始标签和…

一次配置Docker环境的完整记录

一次配置Docker环境的完整记录 Docker环境搭建报错与解决报错一报错二报错三 Docker环境搭建 本节介绍了一次配置docker环境的完整记录&#xff1a; 编写Dockerfile文件&#xff1a; FROM pytorch/pytorch:1.10.0-cuda11.3-cudnn8-develRUN rm /etc/apt/sources.list.d/cuda.l…

C++设计模式|创建型 2.工厂模式

1.简单工厂思想 简单工厂模式不属于23种设计模式之⼀&#xff0c;更多的是⼀种编程习惯。它的核心思想是将产品的创建过程封装在⼀个⼯⼚类中&#xff0c;把创建对象的流程集中在这个⼯⼚类⾥⾯。卡码网将其结构描述为下图所示的情况&#xff1a; 简单⼯⼚模式包括三个主要⻆⾊…

zabbix 自动发现与自动注册 部署 zabbix 代理服务器

zabbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbix server 登记耗时较久&#xff0c;且压力会较大。1.确保客户端…

uboot的移植

文章目录 一、官方uboot移植1.Uboot系统复制到Ubuntu系统2.解压Uboot系统3.编译Uboot系统4.生成可执行文件5.将u-boot.bin烧录到SD卡6.SD卡插入到板子&#xff0c;启动方式选择SD卡7.复位板子&#xff0c;查看打印信息&#xff0c;编译时间是否正常 二、根据官方提供的uboot添加…

frp 内网穿透配置(v0.55.1 版本)

注意&#xff1a;从 [v0.52.0] 版本开始&#xff0c;配置文件由 frps.ini 改成了 frps.toml 一种快速反向代理&#xff0c;可帮助您将 NAT 或防火墙后面的本地服务器暴露给 Internet。 GitHub 地址 &#xff1a; github.com/fatedier/fr… 下载之后如果碰到杀毒软件报毒&#x…

富文本在线编辑器 - tinymce

tinymce 项目是一个比较好的富文本编辑器. 这里有个小demo, 下载下来尝试一下, 需要配置个本地服务器才能够访问, 我这里使用的nginx, 下面是我的整个操作过程: git clone gitgitee.com:chick1993/layui-tinymce.git cd layui-tinymcewget http://nginx.org/download/nginx-1.…

00_Qt概述以及如何创建一个QT新项目

Qt概述 1.Qt概述1.1 什么是Qt1.2 Qt的发展史1.3 支持的平台1.4 Qt版本1.5 Qt的下载与安装1.6 Qt的优点 2.QT新项目创建3.pro文件4.主函数5.代码命名规范和快捷键 1.Qt概述 1.1 什么是Qt Qt是一个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供建立艺术级图形界面…

【一竞技CS2】VP战队官宣签下electroNic取代mir

1、近日VP战队官宣签下electroNic&#xff0c;以取代阵容中的mir。 electroNic自己也表示&#xff1a;“VP是一支顶级队伍。阵容核心曾赢得Major冠军&#xff0c;所有队员都处于巅峰状态并且时刻准备着去争夺冠军。我们有着一样的雄心壮志。 此外我还对和Jame很感兴趣&#xf…

解决nginx日志过大问题

1. 问题点 nginx默认的日志在logs/access.log&#xff0c;并且是一直累加写入&#xff0c;时间长了就会非常大&#xff0c;占用过多的硬盘&#xff0c;如果强行删除是很不友好的&#xff0c;需要重启服务&#xff1b; 2. 文件分割 上图文件已经达到了十个G左右 处理的思路肯定…

AI大模型探索之路-应用篇14:认识国产开源大模型GLM

目录 前言 一、国产主流大模型概览 1. 国内主流大模型清单 2. 主流大模型综合指数 3. 大语言模型评测榜单 二、GLM大模型介绍 三、GLM大模型发展历程 四、GLM家族之基座模型GLM-130B 五、GLM家族之ChatGLM3 六、GLM家族之WebGLM 七、GLM家族之CogVLM 1. CogVLM 2. …

2024五一杯数学建模A题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

P9241 [蓝桥杯 2023 省 B] 飞机降落

原题链接&#xff1a;[蓝桥杯 2023 省 B] 飞机降落 - 洛谷 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 dfs全排列的变形题。 因为最后问飞机是否降落&#xff0c;并且一架飞机降落完毕时另一架飞机才能降落。所以我们设置dfs的两个变量cnt为安全…