深入理解 Vue3 中 ref 与 reactive 的区别及应用
深入理解 Vue3 中 ref 与 reactive 的区别及应用
在 Vue3 的开发世界里,响应式编程是其核心特性之一,而ref与reactive作为实现响应式的关键 API,理解它们的区别和适用场景对于开发者来说至关重要。本文将带你深入剖析这两个 API,帮助你在开发过程中做出更合适的选择。
一、reactive:构建响应式对象的利器
reactive主要用于创建一个响应式的对象。它的强大之处在于能够递归地将对象的所有属性转换为响应式,这意味着即使对象内部存在嵌套的对象或数组,它们也会自动变成响应式的。
来看一个简单的示例:
import { reactive } from 'vue';const state = reactive({count: 0,message: 'Hello'
});
在这个例子中,state对象的count和message属性都具备响应式特性。当这些属性的值发生变化时,与之绑定的 DOM 也会自动更新,为用户呈现最新的数据。
二、ref:灵活的响应式数据引用
ref用于创建一个响应式的数据引用,它的应用场景更为广泛,可以包装基本数据类型(如number、string、boolean等)和对象。当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属性添加get和set访问器,从而实现响应式。 - 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 的组合使用
在实际项目开发中,ref和reactive常常组合使用,发挥各自的优势,构建复杂的响应式应用。比如,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 的开发过程中,reactive和ref是实现响应式编程的重要工具。reactive擅长处理复杂的对象结构及其属性,而ref则在管理简单基本数据类型或单独数据时表现出色。通过深入理解它们之间的区别和适用场景,并在实际项目中灵活运用,开发者能够更高效地进行状态管理和应用开发,打造出性能卓越、用户体验良好的 Vue 应用程序。希望本文能帮助你更好地掌握这两个 API,在 Vue 3 的开发道路上更进一步!
相关文章:
深入理解 Vue3 中 ref 与 reactive 的区别及应用
深入理解 Vue3 中 ref 与 reactive 的区别及应用 在 Vue3 的开发世界里,响应式编程是其核心特性之一,而ref与reactive作为实现响应式的关键 API,理解它们的区别和适用场景对于开发者来说至关重要。本文将带你深入剖析这两个 API,…...
TDengine 客户端连接工具 taos-Cli
简介工具获取运行命令行参数 基础参数高级参数 数据导出/导入 数据导出数据导入 执行 SQL 脚本使用小技巧 TAB 键自动补全设置字符列显示宽度其它 错误代码表 简介 TDengine 命令行工具(以下简称 TDengine CLI)是用户操作 TDengine 实例并与之交互最简…...
Linux(ubuntu)下载ollama速度慢解决办法
国内安装Ollama都很慢,因为一直卡在下载中,直接通过官网的链接地址下载方法: curl -fsSL https://ollama.com/install.sh | sh速度大概是10min下载1%,完全不能接受啊! 其中很好的一个加速方式是通过使用github文件加速…...
Mac安装JD-GUI
Mac安装反编译工具步骤如下: 打开官网https://java-decompiler.github.io/ 选择下载mac的安装包解压下载好的压缩包,点击JD-GUI安装 有可能会遇到如下错误。请先检查是否安装JDK,通过java -version命令查看是否是1.8版本的jdk如果jdk没问题&…...
Jenkins 配置 Git Parameter 四
Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件,请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…...
【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南
【AI】Docker中快速部署Ollama并安装DeepSeek-R1模型: 一步步指南 一、前言 为了确保在 Docker 环境中顺利安装并高效运行 Ollama 以及 DeepSeek 离线模型,本文将详细介绍整个过程,涵盖从基础安装到优化配置等各个方面。通过对关键参数和配置的深入理解…...
Python 自然语言处理(NLP)和文本挖掘的常规操作过程
Python 自然语言处理(NLP)和文本挖掘 自然语言处理(NLP)和文本挖掘是数据科学中的重要领域,涉及对文本数据的分析和处理。Python 提供了丰富的库和工具,用于执行各种 NLP 和文本挖掘任务。以下是一些常见的…...
传统数组 vs vector和list
传统的数组: int arr[10]; 传统的数组有以下的缺点: 1)长度不可修改 2)内存分配 局部数组:把数组定在函数内, 数组便是局部变量,故会被分配在栈上 但栈的大小是有限制的 ,故其在内存中不能超…...
CRMEB 多商户版v3.0.1源码全开源+PC端+Uniapp前端+搭建教程
一.介绍 crmeb多商户是一套B2B2C商家入驻模式的平台多商户商城系统,系统支持平台自营、联营、招商等多种运营模式,可满足企业新零售、批发、分销、预售、O2O、多店、商铺入驻等各种业务需求。 后端全开源、uniapp多端可编译! 二、搭建教程…...
【ESP32】ESP-IDF开发 | WiFi开发 | HTTPS服务器 + 搭建例程
1. 简介 1.1 HTTPS HTTPS(HyperText Transfer Protocol over Secure Socket Layer),全称安全套接字层超文本传输协议,一般理解为HTTPSSL/TLS,通过SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信…...
Vue2 中使用 UniApp 时,生命周期钩子函数总结
在 Vue2 中使用 UniApp 时,生命周期钩子函数是一个重要的概念。它允许开发者在特定的时间点运行代码,管理组件的生命周期。以下是 Vue2 中 UniApp 常用的生命周期钩子函数总结: 1. beforeCreate 说明: 组件实例刚被创建,此时数据…...
如何在 Vue 3 中使用 Vue Router 和 Vuex
在 Vue 3 中使用 Vue Router 1. 安装 Vue Router 在项目根目录下,通过 npm 或 yarn 安装 Vue Router 4(适用于 Vue 3): npm install vue-router4 # 或者使用 yarn yarn add vue-router42. 创建路由配置文件 在 src 目录下创建…...
Fiori APP配置中的Semantic object 小bug
在配置自开发程序的Fiori Tile时,需要填入Semantic Object。正常来说,是需要通过事务代码/N/UI2/SEMOBJ来提前新建的。 但是在S4 2022中,似乎存在一个bug,即无需新建也能输入自定义的Semantic Object。 如下,当我们任…...
【触想智能】工业显示器和普通显示器的区别以及工业显示器的主要应用领域分析
在现代工业中,工业显示器被广泛应用于各种场景,从监控系统到生产控制,它们在实时数据显示、操作界面和信息传递方面发挥着重要作用。与普通显示器相比,工业显示器在耐用性、可靠性和适应特殊环境的能力上有着显著的差异。 触想工业…...
BPMN.js 与 DeepSeek 集成:打造个性化 Web 培训项目的秘诀
在数字化时代,Web培训项目的需求日益增长,特别是对于程序员群体,他们寻求高效、灵活的方式来提升自己的技能。本文将深入探讨如何评估BPMN.js与DeepSeek集成方案,以满足开发Web培训项目的需求。 BPMN.js 的优势 BPMN.js是一个专…...
第二月:学习 NumPy、Pandas 和 Matplotlib 是数据分析和科学计算的基础
以下是一个为期 **1 个月(30 天)**的详细学习计划,精确到每天的学习内容和练习作业,帮助你系统地掌握 NumPy、Pandas 和 Matplotlib 的核心功能。 第 1 周:NumPy 基础 Day 1:NumPy 简介与数组创建 学习内…...
安全测试|SSRF请求伪造
前言 SSRF漏洞是一种在未能获取服务器权限时,利用服务器漏洞,由攻击者构造请求,服务器端发起请求的安全漏洞,攻击者可以利用该漏洞诱使服务器端应用程序向攻击者选择的任意域发出HTTP请求。 很多Web应用都提供了从其他的服务器上…...
Flink提交pyflink任务
1.官方文档: 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 计数器模式,通过加密递增计数器生成密钥流,后密钥流与明文分组异或得密文分组可并行性进行加密或者解密,性能较高明文可以是任意长度,不需要填充可以直接加密或解密指定块,块与块间不具有依赖关系 参数说明 任…...
Map 和 Set
目录 一、搜索 概念: 模型: 二、Map 编辑 1.Map 实例化: 2. Map的常见方法: 3.Map的常见方法演示: 1. put(K key, V value):添加键值对 3. containsKey(Object key):检查键是否存在 4.…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
