当前位置: 首页 > news >正文

深入理解 Vue3 中 ref 与 reactive 的区别及应用

深入理解 Vue3 中 ref 与 reactive 的区别及应用

在 Vue3 的开发世界里,响应式编程是其核心特性之一,而refreactive作为实现响应式的关键 API,理解它们的区别和适用场景对于开发者来说至关重要。本文将带你深入剖析这两个 API,帮助你在开发过程中做出更合适的选择。

 

一、reactive:构建响应式对象的利器

reactive主要用于创建一个响应式的对象。它的强大之处在于能够递归地将对象的所有属性转换为响应式,这意味着即使对象内部存在嵌套的对象或数组,它们也会自动变成响应式的。

来看一个简单的示例:

import { reactive } from 'vue';const state = reactive({count: 0,message: 'Hello'
});

在这个例子中,state对象的countmessage属性都具备响应式特性。当这些属性的值发生变化时,与之绑定的 DOM 也会自动更新,为用户呈现最新的数据。

 

二、ref:灵活的响应式数据引用

ref用于创建一个响应式的数据引用,它的应用场景更为广泛,可以包装基本数据类型(如numberstringboolean等)和对象。当ref包装的值被修改时,Vue 会自动触发相关的更新机制,更新与之绑定的 DOM。

例如,创建一个用于存储数字的ref

import { ref } from 'vue';const count = ref(0);

这里的count就是一个响应式的数据引用。需要注意的是,在访问ref包装的值时,通常需要通过.value属性来获取实际的值。但在模板中使用时,Vue 会自动解包,无需手动添加.value

 

三、ref 与 reactive 的详细区别

(一)用途差异

  • reactive:专注于创建包含多个属性的响应式对象,适用于管理复杂的状态结构,如状态机、表单数据等。
  • ref:更侧重于管理简单的数据类型,以及需要单独处理或传递的变量,在处理基本数据类型时优势明显。

(二)数据结构要求

  • reactive:必须接收一个对象作为参数,对基本数据类型的支持不够直接,虽然可以通过一些技巧(如reactive({ value: 1}))来处理,但使用起来不如ref方便。
  • ref:可以接受任意类型的数据,无论是基本数据类型还是对象,都能轻松应对。

(三)访问方式不同

  • reactive:对象的属性可以直接访问,例如console.log(state.count)
  • ref:在 JavaScript 代码中访问时,需要使用.value属性,如console.log(count.value);不过在模板中,ref包装的值会自动解包,可直接使用,如{{ count }}

(四)响应式转换原理

  • ref:在 Vue 3 中,虽然实际实现更为复杂,但基本原理类似于通过Object.defineProperty().value属性添加getset访问器,从而实现响应式。
  • reactive:基于Proxy对象实现响应式,它能够拦截对象的各种操作(如属性读取、设置、删除等),这种方式使得reactive在处理复杂的嵌套对象时更加高效和灵活。

(五)性能表现

在处理大型对象和复杂状态时,reactive基于Proxy的实现方式能够更高效地追踪依赖和进行更新,相比之下,ref在处理简单数据类型时性能更优,因为其操作相对简单直接。

 

四、何时选择使用 reactive 或 ref

(一)使用 reactive 的场景

当需要管理包含多个相关属性的复杂状态对象时,reactive是不二之选。以表单数据管理为例:

<template><form @submit.prevent="submitForm"><input v-model="formData.name" type="text" placeholder="Name"><input v-model="formData.email" type="email" placeholder="Email"><button type="submit">Submit</button></form><p v-if="formData.submitted">Form submitted successfully!</p>
</template><script>
import { reactive } from 'vue';export default {setup() {const formData = reactive({name: '',email: '',submitted: false});const submitForm = () => {// 这里可以添加表单提交的逻辑,比如发送数据到服务器formData.submitted = true;};return { formData, submitForm };}
};
</script>

在这个例子中,使用reactive可以方便地管理表单的各种状态,包括输入框的值和提交状态,使代码结构清晰,易于维护。

(二)使用 ref 的场景

如果要管理简单的数据类型,如计数器的值、输入框的文本长度等,ref更为简便和高效。例如,在一个组件中跟踪用户点击按钮的次数:

html

<template><button @click="increment">Click me</button><p>You clicked {{ count }} times.</p>
</template><script>
import { ref } from 'vue';export default {setup() {const count = ref(0);const increment = () => {count.value++;};return { count, increment };}
};
</script>

在这个场景下,使用ref可以简洁地实现对点击次数的响应式管理,代码简洁明了。

 

五、ref 与 reactive 的组合使用

在实际项目开发中,refreactive常常组合使用,发挥各自的优势,构建复杂的响应式应用。比如,reactive对象的某个属性可能是一个ref

html

<template><div><p>{{ state.obj.count }}</p><button @click="incrementCount">Increment</button></div>
</template><script>
import { ref, reactive } from 'vue';export default {setup() {const count = ref(0);const state = reactive({obj: { count }});const incrementCount = () => {count.value++;};return { state, incrementCount };}
};
</script>

这种组合方式既利用了reactive对复杂对象结构的管理能力,又借助了ref对单独数据的灵活处理,为开发者提供了极大的便利。

 

六、总结

在 Vue 3 的开发过程中,reactiveref是实现响应式编程的重要工具。reactive擅长处理复杂的对象结构及其属性,而ref则在管理简单基本数据类型或单独数据时表现出色。通过深入理解它们之间的区别和适用场景,并在实际项目中灵活运用,开发者能够更高效地进行状态管理和应用开发,打造出性能卓越、用户体验良好的 Vue 应用程序。希望本文能帮助你更好地掌握这两个 API,在 Vue 3 的开发道路上更进一步!

相关文章:

深入理解 Vue3 中 ref 与 reactive 的区别及应用

深入理解 Vue3 中 ref 与 reactive 的区别及应用 在 Vue3 的开发世界里&#xff0c;响应式编程是其核心特性之一&#xff0c;而ref与reactive作为实现响应式的关键 API&#xff0c;理解它们的区别和适用场景对于开发者来说至关重要。本文将带你深入剖析这两个 API&#xff0c;…...

TDengine 客户端连接工具 taos-Cli

简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具&#xff08;以下简称 TDengine CLI&#xff09;是用户操作 TDengine 实例并与之交互最简…...

Linux(ubuntu)下载ollama速度慢解决办法

国内安装Ollama都很慢&#xff0c;因为一直卡在下载中&#xff0c;直接通过官网的链接地址下载方法&#xff1a; curl -fsSL https://ollama.com/install.sh | sh速度大概是10min下载1%&#xff0c;完全不能接受啊&#xff01; 其中很好的一个加速方式是通过使用github文件加速…...

Mac安装JD-GUI

Mac安装反编译工具步骤如下&#xff1a; 打开官网https://java-decompiler.github.io/ 选择下载mac的安装包解压下载好的压缩包&#xff0c;点击JD-GUI安装 有可能会遇到如下错误。请先检查是否安装JDK&#xff0c;通过java -version命令查看是否是1.8版本的jdk如果jdk没问题&…...

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件&#xff0c;请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…...

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南

【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南 一、前言 为了确保在 Docker 环境中顺利安装并高效运行 Ollama 以及 DeepSeek 离线模型&#xff0c;本文将详细介绍整个过程&#xff0c;涵盖从基础安装到优化配置等各个方面。通过对关键参数和配置的深入理解…...

Python 自然语言处理(NLP)和文本挖掘的常规操作过程

Python 自然语言处理&#xff08;NLP&#xff09;和文本挖掘 自然语言处理&#xff08;NLP&#xff09;和文本挖掘是数据科学中的重要领域&#xff0c;涉及对文本数据的分析和处理。Python 提供了丰富的库和工具&#xff0c;用于执行各种 NLP 和文本挖掘任务。以下是一些常见的…...

传统数组 vs vector和list

传统的数组&#xff1a; int arr[10]&#xff1b; 传统的数组有以下的缺点&#xff1a; 1&#xff09;长度不可修改 2)内存分配 局部数组:把数组定在函数内&#xff0c; 数组便是局部变量&#xff0c;故会被分配在栈上 但栈的大小是有限制的 &#xff0c;故其在内存中不能超…...

CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程

一.介绍 crmeb多商户是一套B2B2C商家入驻模式的平台多商户商城系统&#xff0c;系统支持平台自营、联营、招商等多种运营模式&#xff0c;可满足企业新零售、批发、分销、预售、O2O、多店、商铺入驻等各种业务需求。 后端全开源、uniapp多端可编译&#xff01; 二、搭建教程…...

【ESP32】ESP-IDF开发 | WiFi开发 | HTTPS服务器 + 搭建例程

1. 简介 1.1 HTTPS HTTPS&#xff08;HyperText Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;全称安全套接字层超文本传输协议&#xff0c;一般理解为HTTPSSL/TLS&#xff0c;通过SSL证书来验证服务器的身份&#xff0c;并为浏览器和服务器之间的通信…...

Vue2 中使用 UniApp 时,生命周期钩子函数总结

在 Vue2 中使用 UniApp 时&#xff0c;生命周期钩子函数是一个重要的概念。它允许开发者在特定的时间点运行代码&#xff0c;管理组件的生命周期。以下是 Vue2 中 UniApp 常用的生命周期钩子函数总结&#xff1a; 1. beforeCreate 说明: 组件实例刚被创建&#xff0c;此时数据…...

如何在 Vue 3 中使用 Vue Router 和 Vuex

在 Vue 3 中使用 Vue Router 1. 安装 Vue Router 在项目根目录下&#xff0c;通过 npm 或 yarn 安装 Vue Router 4&#xff08;适用于 Vue 3&#xff09;&#xff1a; npm install vue-router4 # 或者使用 yarn yarn add vue-router42. 创建路由配置文件 在 src 目录下创建…...

Fiori APP配置中的Semantic object 小bug

在配置自开发程序的Fiori Tile时&#xff0c;需要填入Semantic Object。正常来说&#xff0c;是需要通过事务代码/N/UI2/SEMOBJ来提前新建的。 但是在S4 2022中&#xff0c;似乎存在一个bug&#xff0c;即无需新建也能输入自定义的Semantic Object。 如下&#xff0c;当我们任…...

【触想智能】工业显示器和普通显示器的区别以及工业显示器的主要应用领域分析

在现代工业中&#xff0c;工业显示器被广泛应用于各种场景&#xff0c;从监控系统到生产控制&#xff0c;它们在实时数据显示、操作界面和信息传递方面发挥着重要作用。与普通显示器相比&#xff0c;工业显示器在耐用性、可靠性和适应特殊环境的能力上有着显著的差异。 触想工业…...

BPMN.js 与 DeepSeek 集成:打造个性化 Web 培训项目的秘诀

在数字化时代&#xff0c;Web培训项目的需求日益增长&#xff0c;特别是对于程序员群体&#xff0c;他们寻求高效、灵活的方式来提升自己的技能。本文将深入探讨如何评估BPMN.js与DeepSeek集成方案&#xff0c;以满足开发Web培训项目的需求。 BPMN.js 的优势 BPMN.js是一个专…...

第二月:学习 NumPy、Pandas 和 Matplotlib 是数据分析和科学计算的基础

以下是一个为期 **1 个月&#xff08;30 天&#xff09;**的详细学习计划&#xff0c;精确到每天的学习内容和练习作业&#xff0c;帮助你系统地掌握 NumPy、Pandas 和 Matplotlib 的核心功能。 第 1 周&#xff1a;NumPy 基础 Day 1&#xff1a;NumPy 简介与数组创建 学习内…...

安全测试|SSRF请求伪造

前言 SSRF漏洞是一种在未能获取服务器权限时&#xff0c;利用服务器漏洞&#xff0c;由攻击者构造请求&#xff0c;服务器端发起请求的安全漏洞&#xff0c;攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…...

Flink提交pyflink任务

1.官方文档&#xff1a; flink1.14:https://nightlies.apache.org/flink/flink-docs-release-1.14/docs/deployment/cli/#submitting-pyflink-jobs flink1.18:https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/deployment/cli/#submitting-pyflink-jobs 2.提…...

对称算法模式之CTR

Note 计数器模式&#xff0c;通过加密递增计数器生成密钥流&#xff0c;后密钥流与明文分组异或得密文分组可并行性进行加密或者解密&#xff0c;性能较高明文可以是任意长度&#xff0c;不需要填充可以直接加密或解密指定块&#xff0c;块与块间不具有依赖关系 参数说明 任…...

Map 和 Set

目录 一、搜索 概念&#xff1a; 模型&#xff1a; 二、Map ​编辑 1.Map 实例化&#xff1a; 2. Map的常见方法&#xff1a; 3.Map的常见方法演示&#xff1a; 1. put(K key, V value)&#xff1a;添加键值对 3. containsKey(Object key)&#xff1a;检查键是否存在 4.…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...