学习 Vue 3 源码

Vue 3 是一款流行的前端框架,它的数据代理和虚拟 DOM 实现是其核心功能之一

Vue 3 的数据代理

在 Vue 3 中,数据代理是指将组件实例的属性代理到其内部状态对象上。这使得开发者可以使用更便捷的方式来访问和修改组件的状态。

Vue 3 的数据代理实现主要包含以下两个步骤:

1. 在组件实例上创建一个 `$data` 属性,用于存储组件的内部状态。
2. 使用 `Object.defineProperty()` 函数将组件实例的属性代理到 `$data` 对象上。下面是一个简单的示例代码,演示了如何在 Vue 3 中实现数据代理:

function proxy(target, sourceKey, key) {Object.defineProperty(target, key, {get() {return target[sourceKey][key];},set(value) {target[sourceKey][key] = value;},});
}const App = {data() {return {message: 'Hello, Vue 3!',};},
};const vm = {$data: App.data(),
};for (const key in vm.$data) {proxy(vm, '$data', key);
}console.log(vm.message); // 输出:Hello, Vue 3!
vm.message = 'Hello, World!';
console.log(vm.message); // 输出:Hello, World!


```

在上面的示例代码中,我们通过 `proxy()` 函数将 `$data` 对象中的属性代理到 `vm` 对象上。通过这种方式,我们可以非常方便地访问和修改组件的内部状态。

Vue 3 的虚拟 DOM

Vue 3 的虚拟 DOM 是指将组件的结构表示为一个树形结构,然后使用 JavaScript 对象来描述该结构。这使得开发者可以更方便地操作组件,并且可以提高应用程序的性能。

Vue 3 的虚拟 DOM 实现主要包含以下两个步骤:

1. 创建一个 JavaScript 对象来描述组件的结构。
2. 使用递归函数遍历该对象,并将其转换为真实的 DOM 元素。

下面是一个简单的示例代码,演示了如何在 Vue 3 中实现虚拟 DOM:

function createVNode(tag, props, children) {return {tag,props,children,};
}function render(vnode, container) {if (typeof vnode === 'string') {container.textContent = vnode;return;}const { tag, props, children } = vnode;const element = document.createElement(tag);if (props) {for (const key in props) {element.setAttribute(key, props[key]);}}if (children) {children.forEach(child => {render(child, element);});}container.appendChild(element);
}const App = createVNode('div', { id: 'app' }, [createVNode('p', null, ['Hello, Vue 3!']),
]);render(App, document.getElementById('app'));

在上面的示例代码中,我们创建了一个简单的虚拟 DOM 树,并使用 `render()` 函数将其转换为真实的 DOM 元素。通过这种方式,我们可以更方便地操作组件,并且可以提高应用程序的性能。

总结

Vue 3 的数据代理和虚拟 DOM 是其核心功能之一,在开发应用程序时非常重要。当然,上述代码只是简单的实现了vue3的部分功能,具体还需要以官方文档为主

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

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

相关文章

docker-centos中基于keepalived+niginx模拟主从热备完整过程

文章目录 一、环境准备二、主机1、环境搭建1.1 镜像拉取1.2 创建网桥1.3 启动容器1.4 配置镜像源1.5 下载工具包1.6 下载keepalived1.7 下载nginx 2、配置2.1 配置keepalived2.2 配置nginx2.2.1 查看nginx.conf2.2.2 修改index.html 3、启动3.1 启动nginx3.2 启动keepalived 4、…

【HarmonyOS开发】控件开发过程中,知识点记录

1、问题记录及解决方案 1.1 资源(Icon&i18n)问题 控件:只有一个JS文件,不会将任何资源型文件(图片、字体、默认文字等)打包到SO中。因此,当我们开发控件时,需要将需要使用到的资…

【机器学习】042_迁移学习

一、概述、定义 目的: 迁移学习的目的是将某个领域或任务上学习到的模式、知识应用到不同但相关的领域里,获取更多数据,而不必投入许多时间人力来进行数据的标注。 举例: 已经会下中国象棋,就可以类比着来学习国际…

Java单元测试:JUnit和Mockito的使用指南

引言: 在软件开发过程中,单元测试是一项非常重要的工作。通过单元测试,我们可以验证代码的正确性、稳定性和可维护性,帮助我们提高代码质量和开发效率。本文将介绍Java中两个常用的单元测试框架:JUnit和Mockito&#x…

Navicat连接Oracle数据库

Navicat连接Oracle数据库 打开服务里面找到Oracle服务 OracleServerXE或者OracleServerTTL 创建数据库连接 连接名默认自己起 主机选择本地 端口默认 服务名在服务中可以找到输入后缀 用户名默认都是system 密码是创建oracle时候填写的口令 点击测试连接即可

Spring Boot中的事务是如何实现的?懂吗?

SpringBoot中的事务管理,用得好,能确保数据的一致性和完整性;用得不好,可能会给性能带来不小的影响哦。 基本使用 在SpringBoot中,事务的使用非常简洁。首先,得感谢Spring框架提供的Transactional注解&am…

【金融数据分析】计算沪深300指数行业权重分布并用饼图展示

前言 前面的文章我们已经介绍了如何获取沪深300成分股所述行业以及权重的数据,想要了解这部分内容的小伙伴可以阅读上一篇文章 springbootjdbcTemplatesqlite编程示例——以沪深300成分股数据处理为例-CSDN博客 那么有了上文获取的数据,我们实际上可以…

【rabbitMQ】rabbitMQ控制台模拟收发消息

目录 1.新建队列 2.交换机绑定队列 3.查看消息是否到达队列 总结: 1.新建队列 2.交换机绑定队列 点击amq.fonout 3.查看消息是否到达队列 总结: 生产者(publisher)发送消息,先到达交换机,再到队列&…

微信小程序uni-app:常用Form表单组件使用示例

目录 input 输入框picker 选择器 input 输入框 https://developers.weixin.qq.com/miniprogram/dev/component/input.htmlhttps://uniapp.dcloud.net.cn/component/input.html <inputclass"input-class"type"text"v-model"value"placeholde…

Linux下文本三剑客:grep、awk、sed之对比

一、grep 主要用于搜索某些字符串&#xff1b;sed、awk 用于处理文本&#xff1a; grep基本是以行为单位处理文本的&#xff1b; 而awk可以做更细分的处理&#xff0c;通过指定分隔符将一行&#xff08;一条记录&#xff09;划分为多个字段&#xff0c;以字段为单位处理文本。…

python输出菱形字符图案 附实战代码

下面是一个Python程序&#xff0c;可以用来输出菱形字符图案。这个程序使用了两个嵌套的for循环&#xff0c;以及字符串连接操作。 # 获取用户输入 n int(input("请输入菱形的边长&#xff1a;"))# 生成上半部分菱形 for i in range(1, n 1, 2):print(" &quo…

SDK,但未在应用内的隐私政策/在AppGallery Connect上提交的隐私政策内容中进行明示,不符合华为应用市场审核标准。

&#xff08;暂时用不到的也建议收藏一下&#xff0c;因为文章持续更新中&#xff09; 最新更改时间&#xff1a;20023-12-10 第三方SDK合集列表 为了确保用户个人信息的安全&#xff0c;我们对使用到的第三方提供的软件开发包&#xff08;SDK&#xff09;进行了严格的安全检…

期末速成数据库极简版【存储过程】(5)

目录 【7】系统存储过程 【8】用户存储过程——带输出参数的存储过程 创建存储过程 存储过程调用 【9】用户存储过程——不带输出参数的存储过程 【7】系统存储过程 系统存储我们就不做过程讲解用户存储过程会考察一道大题&#xff0c;所以我们把重点放在用户存储过程。…

vscode 编写爬虫爬取王者荣耀壁纸

网上关于爬虫大部分教程和编辑器用的都不是vscode &#xff0c;此教程用到了vscode、Python、bs4、requests。 vscode配置Python安装环境可以看看这个大佬的教程 03-vscode安装和配置_哔哩哔哩_bilibili vscode配置爬虫环境可以参考这个大佬的教程【用Vscode实现简单的python…

U4_1 语法分析之自顶向下分析

文章目录 一、定义1、任务2、对比3、方法4、自顶向下面临问题 二、自顶向下分析1、概念2、特点3、二义性问题4、左递归问题1&#xff09;概念2&#xff09;消除3&#xff09;间接左递归 5、回溯问题1&#xff09;概念2&#xff09;消除3&#xff09;解决方法 6、总结 三、递归子…

Java 线程池中 submit() 和 execute() 方法有什么区别?

Java 线程池中 submit() 和 execute() 方法有什么区别&#xff1f; 在 Java 中&#xff0c;ExecutorService 接口是用于管理和执行线程的框架&#xff0c;它定义了两个用于提交任务的方法&#xff1a;submit() 和 execute()。这两种方法有一些区别&#xff1a; 返回值&#xf…

【Proteus仿真】【51单片机】光照强度检测系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使共阴数码管&#xff0c;PCF8591 ADC模块、光敏传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示光传感器采集光照强度值&#xff…

Gitzip插件【Github免翻下载】

今天给大家推荐一个github下载的插件&#xff0c;平常大家下载应该无外乎就是以下两种&#xff1a; Download zip利用git clone 但是这两种各有各的弊端&#xff0c;前者一般需要科学上网才可以&#xff0c;后者下载不稳定经常中途断掉。 今天给推荐一个款浏览器插件-Gitzip.大…

基于SSM的java衣服商城

基于SSM的java衣服商城 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java EE项目 项目名称&#xff1a;基于SSM的美衣商城 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;Layui等 后端技术…

Flask和Vue框架实现WebSocket消息通信

1 安装环境 1.1 安装Flask环境 主要的安装包 Flask、Flask-SocketIO&#xff0c;注意Python版本要求3.6 # Flask-SocketIO参考地址 https://flask-socketio.readthedocs.io/en/latest/ https://github.com/miguelgrinberg/flask-socketio更新基础环境 # 更新pip python -m …