Vue3中的Ref与Reactive:深入理解响应式编程
前言
Vue 3是一个功能强大的前端框架,它引入了一些令人兴奋的新特性,其中最引人注目的是ref
和reactive
。这两个API是Vue 3中响应式编程的核心,本文将深入探讨它们的用法和差异。
什么是响应式编程?
在Vue中,响应式编程是一种使数据与UI保持同步的方式。当数据变化时,UI会自动更新,反之亦然。这种机制大大简化了前端开发,使我们能够专注于数据和用户界面的交互,而不必手动处理DOM更新。
Ref
ref
是Vue 3中的一个简单响应式API,用于创建一个包装基本数据类型的响应式引用(也可以包装复杂类型,只不过底层还是由reactive的方式实现的)。它的主要优点是能够轻松包装基本数据类型,并且具有清晰的访问和更新方式。
用法示例
import { ref } from 'vue';const count = ref(0);// 访问数据
console.log(count.value); // 输出 0// 更新数据
count.value = 1;
在上面的示例中,我们首先导入了ref
函数,然后使用它创建了一个名为count
的响应式引用。我们可以像访问普通变量一样访问它,并且当我们更新count
时,相关的UI会自动更新。
优势
- 明确的数据访问语法(.value)
- 适用于包装基本数据类型,如数字、字符串等。
- 更容易阅读和理解,适合处理简单的响应式数据。
Reactive
与ref
不同,reactive
是用于创建包装对象的响应式引用。这意味着它可以用于创建响应式对象,而不仅仅是基本数据类型。它的主要优势是在处理复杂数据结构时更加灵活,能够包装整个对象。
用法示例
import { reactive } from 'vue';const user = reactive({name: 'John',age: 30,
});// 访问数据
console.log(user.name); // 输出 'John'// 更新数据
user.age = 31;
在这个示例中,我们使用reactive
来创建了一个名为user
的响应式对象。我们可以像访问普通对象属性一样访问和更新user
的属性,Vue会自动追踪并处理数据变化。
优势
- 适用于包装复杂的对象和数据结构,包括嵌套对象。
- 不需要额外的语法(
.value
),直接访问属性。 - 更适合处理多个相关属性的情况,如表单字段或组件状态。
Ref与Reactive的区别
- 数据类型:
ref
用于包装基本数据类型(如数字、字符串),而reactive
用于包装对象。 - 访问数据:使用
ref
时,需要通过.value
来访问数据,而reactive
则允许直接访问属性。 - 数据的包装:
ref
返回一个包装对象,而reactive
返回一个包装后的对象。
Vue 3 响应式系统的原理
Vue 3的响应式系统建立在JavaScript的Proxy
对象和Vue 2的Object.defineProperty
之上,使其更加灵活和强大。vue官方文档对响应式原理的解释
Proxy是什么?
Proxy
是JavaScript中的一个内置对象,它允许你创建一个代理对象,可以用来拦截对目标对象的各种操作,例如读取、写入、属性检索等。Proxy
对象通常用于实现元编程·,这意味着你可以控制、定制对象的行为。
以下是一些关于Proxy
的基本概念和用法:
创建一个 Proxy 对象
要创建一个Proxy
对象,你需要传递两个参数:目标对象和一个处理器对象。处理器对象包含了一些方法,用于定义代理对象的行为。
const target = { name: 'John' };
const handler = {get(target, key) {console.log(`Getting ${key} property`);return target[key];},set(target, key, value) {console.log(`Setting ${key} property to ${value}`);target[key] = value;}
};const proxy = new Proxy(target, handler);
拦截器方法
Proxy
处理器对象中可以包含各种拦截器方法,用于控制不同操作。一些常见的拦截器方法包括:
- get(target, key, receiver):拦截属性的读取操作。
- set(target, key, value, receiver):拦截属性的写入操作。
- has(target, key):拦截 in 运算符。
- deleteProperty(target, key):拦截 delete 运算符。
等等...(其他方法与之类似),这些拦截器方法允许你定义代理对象的行为,以满足你的需求。
使用 Proxy 对象
一旦创建了Proxy
对象,你可以像使用普通对象一样使用它,但它会在后台执行拦截器方法。
console.log(proxy.name); // 会触发 get 拦截器,输出 "Getting name property"
proxy.age = 30; // 会触发 set 拦截器,输出 "Setting age property to 30"
在上面的代码中,我们创建了一个Proxy
对象proxy
,它会拦截对target
对象的读取和写入操作。
应用示例
Proxy
对象的应用非常广泛,它可以用于实现数据绑定、事件系统、拦截操作等等。在一些现代 JavaScript 框架和库中,如 Vue 3 和 Vuex,Proxy
被广泛用于实现响应式系统,它能够监听对象的变化并自动触发相应的更新操作。
ref的原理
ref
的原理相对简单。它使用Proxy
对象来包装基本数据类型,例如数字、字符串等。当你使用ref创建一个响应式引用时,实际上创建了一个Proxy
对象,它会拦截对该引用的读取和写入操作。
例如,当你访问count.value
时,Proxy
会捕获这个操作,然后返回实际的值。当你更新count.value
时,Proxy
也会捕获这个操作,并触发相关的依赖更新,从而使相关的UI重新渲染。
reactive的原理
reactive
的原理涉及更复杂的对象。它使用Proxy
对象来包装整个对象,而不仅仅是其中的属性。这意味着你可以在一个对象上添加、删除或修改属性,并且这些操作都会被Proxy
捕获。
当你访问或修改一个被reactive
包装的对象的属性时,Proxy
会捕获这些操作,并自动追踪依赖。这意味着当任何属性发生变化时,Vue会知道哪些组件依赖于这些属性,并且会自动更新这些组件以反映最新的数据。
响应式系统的实现
虽然上述是对Vue 3响应式系统的简要解释,但在Vue源码。中,这一机制的实现要更复杂一些。Vue源码中有大量的逻辑用于处理依赖追踪、派发更新等操作,以确保数据和UI之间的同步。
如果你想深入研究Vue的源代码,可以进一步了解它是如何实现的。
总结
Vue 3中的ref
和reactive
是响应式编程的核心工具,它们使数据与UI之间的同步变得轻松。根据您的需求,选择适当的API来包装您的数据,以获得最佳的开发体验。ref适用于基本数据类型,而reactive
适用于对象,通过灵活使用这两者,您可以更轻松地构建出动态的Vue 3应用程序。
希望本文对你有所帮助,深入理解ref
和reactive
将为你在Vue 3中的响应式编程提供坚实的基础。继续探索Vue 3的强大功能,创造出令人印象深刻的Web应用程序吧!
一套Java/.Net+Vue前后端分离的低代码快速开发框架
相关文章:
Vue3中的Ref与Reactive:深入理解响应式编程
前言 Vue 3是一个功能强大的前端框架,它引入了一些令人兴奋的新特性,其中最引人注目的是ref和reactive。这两个API是Vue 3中响应式编程的核心,本文将深入探讨它们的用法和差异。 什么是响应式编程? 在Vue中,响应式编…...

Windows10/11显示文件扩展名 修改文件后缀名教程
前言 写这篇文章的原因是由于我分享的教程中的文件、安装包基本都是存在阿里云盘的,下载后需要改后缀名才能使用。 但是好多同学不会改。。 Windows 10 随便打开一个文件夹,在上方工具栏点击 “查看”点击 “查看” 后下方会显示更详细的工具栏然后点…...

【C++】手撕string(string的模拟实现)
手撕string目录: 一、 Member functions 1.1 constructor 1.2 Copy constructor(代码重构:传统写法和现代写法) 1.3 operator(代码重构:现代写法超级牛逼) 1.4 destructor 二、Other mem…...
用python3编译cv_bridge
文章目录 概要依赖工作空间编译可能遇到的问题error: option --install-layout not recognized概要 当我在编写一个使用传感器图像传输和OpenCV4的ROS包时,从构建到编译代码的一切都很顺利。当我开始运行节点本身时,问题出现了,它给出了以下错误: Assertion failed (tlsSl…...

招商信诺人寿基于 Apache Doris 统一 OLAP 技术栈实践
本文导读: 当前,大数据、人工智能、云计算等技术应用正在推动保险科技发展,加速保险行业数字化进程。在这一背景下,招商信诺不断探索如何将多元数据融合扩充,以赋能代理人掌握更加详实的用户线索,并将智能…...
我的python安装在哪儿了?python安装路径怎么查?
对于 Python 开发者来说,Windows 系统中的 Python 安装路径是非常重要的。在本文中,我们将从多个方面探究如何查看 Python 安装路径,并提供代码示例。 一、使用文件浏览器查看 Python 安装路径 在 Windows 系统中,我们可以使用文…...

视频汇聚/安防监控平台EasyCVR指定到新的硬盘进行存储录像,如何自动挂载该磁盘?
TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…...
读博时的建议或心得
https://www.zhihu.com/question/32210068/answer/264273093 读论文:一开始读论文,一定要读顶会顶刊的,以后也一直要这样。如此,一方面保持了研究的水准,时刻提醒自己:我就是混这个层次的。另一方面&#…...

3分钟,免费制作一个炫酷实用的数据可视化大屏!
在当前大数据时代背景下,数据已成为在工业革命中如同煤炭、石油一般宝贵的资源。但是由于数据越来越庞大、越来越复杂,导致数据的可读性也越来越低。因此,对数据可视化的需求也越来越高,需要解决的问题也越来越复杂,而…...

自费访学|金融公司高管赴世界名校伯克利交流
R经理决定抽出一年时间,自费赴美国访学,向国外导师请教,探讨了解不同社会环境下,各种经济及社会现象的产生和发展,在思维碰撞中提升自身的国际视野。最终我们为其联系到世界名校-加州大学伯克利分校,导师为…...

Databend 开源周报第112期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 理解用户自定义…...

如何学习maya mel语言的经验分享
一、前言 总结一下这十几年来学习和使用mel语言的一些经验,供初学朋参考,哈哈。 这里不说深奥理论,只是朴实经历陈述。 其实,早在2003年,最初接触maya时,就已经涉及到mel的学习,当时在大学里接…...

睿趣科技:新手抖音开店卖什么产品好
抖音已经成为了一款年轻人热爱的社交媒体应用,同时也成为了一种全新的电商平台。对于新手来说,抖音开店卖什么产品是一个备受关注的问题。在这篇文章中,我们将探讨一些适合新手的产品选择,帮助他们在抖音上开店获得成功。 流行时尚…...

【新版】系统架构设计师 - 案例分析 - 架构设计<Web架构>
个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计<Web架构>Web架构知识点单台机器 到 数据库与Web服务器分离应用服务器集群负载均衡负载均衡技术静态与动态算法Session共享机制有状态与无状态 持久化技…...

竞赛选题 基于视觉的身份证识别系统
0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen…...
git详细教程
git详细教程 区域划分单分支操作git log语法常用的参数及其详解git log 结果 git refloggit diff常用的参数及其详解 git reset常用的参数及其详解 git checkoutgit rm常用的参数及其详解 git remote常用的参数及其详解 多分支切换代码融合git switch常用的参数及其详解 git br…...

[old]TeamDev DotNetBrowser Crack
TeamDev DotNetBrowser将 Chromium Web 浏览器添加到您的 .NET 应用程序中。在 WPF 和 WinForms 中显示现代网页。使用 DOM、JS、网络、打印等。在 Windows x86/x64/ARM64、macOS x64/Apple Silicon、Linux x64/ARM64 上运行,支持.NET Framework 4.5 特征 HTML5、C…...

Zynq-Linux移植学习笔记之63- linux内核崩溃的重启
1、背景介绍 在运行linux应用程序的时候,有时会遇到内核崩溃异常的情况,此时串口中会打印出内核崩溃时的堆栈情况,如下: 当出现这个情况后串口就死了,应用也停了,此时无法进行恢复。 之前写过可通过板子w…...
【精华】ubuntu编译openpose
文章目录 (1)参考资料(2)opencv编译(3)Openpose编译(4)异常问题 (1)参考资料 ubuntu20 openpose cuda11.7 cudnn8 opencv4.7.0_Nightmare004的博客-CSDN博客…...

第二届全国高校计算机技能竞赛——Java赛道
第二届全国高校计算机技能竞赛——Java赛道 小赛跳高 签到题 import java.util.*; public class Main{public static void main(String []args) {Scanner sc new Scanner(System.in);double n sc.nextDouble();for(int i 0; i < 4; i) {n n * 0.9;}System.out.printf(&…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...