【Vue3基础】ref 和 reactive

vue3中使用reactive定义的变量响应式丢失问题(重新分配一个新对象会丢失响应性 大坑!!!) 在Vue 3中,可以使用reactive函数将普通JavaScript对象转换为响应式对象,这样当对象的属性发生变化时,就会自动更新相应的UI。但使用reactive时,如果不当使用,可能导致响应性失效,带来一些困扰。这可能让开发者在愉快编码的同时,突然发现某些操作失去了响应性,不明所以。因此,建议在不了解reactive失去响应的情况下慎用,而更推荐使用ref。首先看一下reactive和refreactive// 定义一个响应式变量name:"",age:""});// 请求接口。 阅读详情

ref 和 reactive

1.描述

ref和reactive是 Vue3 中用来实现数据响应式的API

一般情况下,ref定义基本数据类型,reactive定义引用数据类型

2.reactive

reactive一般用于定义引用数据类型(以对象和数组举例),它能够将复杂数据类型的内部属性或者数据项声明为响应式数据,所以reactive的响应式是深层次的。

其底层是通过 ES6 的Proxy来实现数据响应式,相对于 Vue2 的Object.defineProperty,具有以下优点:

  1. 能监听增删操作
  2. 能监听对象属性的变化

用reactive定义对象数据类型举例:

const paginationConfig = reactive({
	pageNum: 1,
	pageSize: 10
}) // 定义

const onChange = () => {
	paginationConfig.pageNum = 2 // js使用
	paginationConfig.pageSize = 20 // js使用
}

在模板中的使用方法如下:

<!-- Vue3模板引用使用 -->
<a-pagination v-model:current="paginationConfig.pageNum"></a-pagination>

但是,如果用reactive定义基本数据类型,会导致报错。

为什么呢?看下面这张图,其中是 Vue3 的部分源码:
在这里插入图片描述
分析可知,使用reactive定义响应式数据时,若给出的数据不是对象类型,会直接返回,不再进行后续的数据响应式处理。这就是为什么reactive只能处理对象类响应式数据。

3.ref

再来看看ref,下面是 Vue3 中ref的部分源码:
在这里插入图片描述
在这里插入图片描述
可以看到,在ref的底层源码中,如果处理的数据为对象类型,实际上还是通过reactive的逻辑来实现响应式。

所以,实际上可以将ref视为reactive的再次封装。

另外,还需要注意一件事,当用ref定义基本类型的响应式数据后,在脚本中使用时,需要加上.value后缀。而在模板中使用时,则不需要,因为 Vue3 会自动给你加上。

因此,在使用方面,ref相较于reactive也更为方便一些。

4.ref和reactive定义数组对比

用ref定义数组举例如下:

const tableData = ref([]) // 定义

const getTableData = async () => {
	const { data } = await getTableDataApi() // 模拟接口获取表格数据
	tableData.value = data // 修改
}

图中以我们常用的表格数据举例,可以看到,ref定义数组与定义基本数据类型没什么差别,接下来看看reactive

const tableData = reactive([]) // 定义

const getTableData = async () => {
	const { data } = await getTableDataApi() // 模拟接口获取表格数据
	tableData = data // 修改,错误示例,这样赋值会使tableData失去响应式
}

注意,这里使用tableData = data的修改方式会造成 tableData 响应式丢失!

所以,定义数组时还是推荐使用ref,使用起来也比较简单。

但如果实在需要使用reactive呢?

有以下几个解决方法:

// 方法一:改为 ref 定义
const tableData = ref([])
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData.value = data // 使用.value重新赋值
}
// 方法二:使用 push 方法
const tableData = reactive([])
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData.push(...data) // 先使用...将data解构,再使用push方法
}
// 方法三:定义时数组外层嵌套一个对象
const tableData = reactive({ list:[] })
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData.list = data // 通过访问list属性重新赋值
}
// 方法四:赋值前再包一层 reactive
const tableData = reactive([])
const getTableData = async () => {
	const { data } = await getTableDataApi()
	tableData = reactive(data) // 赋值前再包一层reactive
}

5.总结

  1. ref用于定义基本类型和引用类型,reactive仅用于定义引用类型
  2. reactive只能用于定义引用数据类型的原因在于内部是通过 ES6 的Proxy实现响应式的,而Proxy不适用于基本数据类型。
  3. ref定义对象时,底层会通过reactive转换成具有深层次的响应式对象,所以ref本质上是reactive的再封装
  4. 在脚本里使用ref定义的数据时,记得加.value后缀
  5. 在定义数组时,建议使用ref,从而可避免reactive定义时值修改导致的响应式丢失问题
  6. reactive 返回值和源对象不同,reactive的属性值可以是 ref值;
vue3中的ref和reactive 特性refreactive响应式原理Proxy数据类型任意类型(包装为Ref对象)仅对象/数组(需为引用类型)访问方式模板中自动解包,JS 中需.value直接访问属性类型系统Ref<T>原始对象类型的代理解构响应式保持响应式(.value需使用toRefs保持响应式在实际开发中,两者通常结合使用:用reactive管理复杂状态对象,用ref处理简单值或作为函数返回值。维度原生实现Vue3 实现实现复杂度较低(基础功能)极高(完整生态)性能基础优化。 阅读详情

相关推荐

源码视角,Vue3为什么推荐使用ref而不是reactive

Vue3为什么推荐使用ref而不是reactive

buaiqiaodaima111的博客 1343

ref和reactive

一,前言 1.ref和reactive是vue3基于组合式api模式下,在setup中用于声明的具有响应式的数据的方法。 二,ref 1.ref用于声明基础类型响应式数据。 import {ref} from 'vue' const age =ref(10) //声明响应式数据 2.ref返回的是被包装过的响应式对象,在setup中访问和修改ref需要使用.value属性 age.value=21 3.在模板中使用时无需使用.value,直接使用即可 <div>{{age}}</di

过客如期的博客 8518

手把手教你用STM32+LAN8720搭建以太网通信模块(含原理图)

本文详细介绍了如何使用STM32微控制器与LAN8720物理层芯片搭建以太网通信模块,涵盖硬件设计、软件配置及常见问题排查。重点讲解了LAN8720的低功耗设计、RMII接口简化布线等特性,以及STM32CubeMX配置和LwIP协议栈移植技巧,助力开发者快速实现稳定可靠的嵌入式网络通信。

CAT789的专栏 413

【Vue3响应式】ref、reactive,以及toRefs 函数

Vue3中的ref和reactive都是响应式数据的实现方式。在Vue3中,我们可以使用ref来将基本数据类型包装为一个响应式对象,使用reactive将对象包装为响应式对象。本文将介绍这两种响应式数据的实现方式以及它们之间的区别。 toRefs 函数可以将一个响应式对象转换为一组响应式属性。这个函数可以用于将父组件中的响应式对象传递给子组件,并在子组件中以单独的响应式属性的形式使用它们。

正在解锁骑着骆驼去南极的世界 1万+

保姆级教程:用PyTorch从零实现SDE扩散模型(附完整代码与MNIST实战)

本文提供了一份详细的PyTorch教程,指导读者从零开始实现SDE扩散模型,并附有完整的代码示例和MNIST数据集实战。通过解释随机微分方程(SDE)的核心概念、模型架构设计、训练流程实现以及采样生成过程,帮助开发者掌握扩散模型的构建与应用。

weixin_28677005的博客 265

别再花钱买商业软件了!这4款免费DIC工具,从散斑生成到应变分析全搞定

本文介绍了4款免费开源的DIC(数字图像相关技术)工具,涵盖从散斑生成到应变分析的全流程,帮助用户零成本构建专业级DIC工作流。这些工具在精度、算法透明度和生态整合方面具有优势,适用于材料力学和实验力学研究,可替代昂贵的商业软件。

weixin_42525369的博客 168

vue中ref()与reactive(的区别)

这时objectReactive.count = 4修改的不再是effect 所监听的代理对象,而是新的普通的不具备响应式能力的对象{count:3}。这时objectReactive.count = 4修改的不再是effect 所监听的代理对象,而是新的普通的不具备响应式能力的对象{count:3}。ref是通过一个中间对象RefImpl持有数据,并通过重写它的set和get方法实现数据劫持的,本质上依旧是通过Object.defineProperty 对RefImpl的value属性进行劫持。

lh15766518127的博客 7466

深入分析RAG知识库多模态数据预处理

多模态企业数据预处理是构建高质量RAG知识库的关键环节。本文详解了处理流程:1)文档格式识别与路由;2)多模态内容提取(文本、图像、音视频);3)结构解析与语义重建;4)数据清洗与增强;5)智能分块(强调语义完整性);6)元数据注入。推荐使用开源工具如PaddleOCR、Whisper、BLIP-2等,或商业API处理复杂场景,最终生成带丰富元数据的结构化内容,为后续向量化检索奠定基础。

qq_35354529的博客 1379

Vue3中的ref和reactive详解扩展

Vue3中的ref和reactive详解扩展 一、ref和reactive 死死记住:ref本质也是reactive,ref(obj)等价于reactive({value: obj}) vue3中实现响应式数据的方法是就是使用ref和reactive,所谓响应式就是界面和数据同步,能实现实时更新 vue2中响应式是通过defineProperty实现的,vue3中是通过ES6的Proxy来实现的 1.reactive reactive的参数必须是一个对象,包括json数据和数组都可以,否则不具有

Lenny-zlp的博客 8120

IC618新手避坑指南:从零在Linux上配置Cadence Virtuoso环境(含cds.lib文件详解)

本文详细介绍了在Linux系统上配置Cadence Virtuoso IC618环境的完整指南,特别针对新手常见问题提供解决方案。重点解析了cds.lib文件的关键配置,包括库路径定义和工艺库管理,并分享了高效工作流设置和典型问题排查技巧,帮助工程师快速搭建稳定的EDA设计环境。

weixin_26805597的博客 553

【重识云原生】第四章云网络4.9.5.1节下一代智能网卡——DPU综述

随着数据中心的高速发展,通信能力和计算能力成为数据中心基础设施的相辅相成的两个重要发展方向。若数据中心仅关注计算能力的提升,通信基础设施的提升跟不上,那么数据中心的整体系统性能依然受限,无法发挥出真正的潜力。DPU的提出背景就是应对这些数据量和复杂性的指数级增长。未来,需要将计算移至接近数据的位置,这是目前业界所公认的以数据为中心的体系结构下的创新。综上,DPU对数据中心来说,是通过更明细的分工来实现效率的提升、实现总体系统的成本最优化。...

junbaozi的专栏 1724

谈谈 Vue3 中的 ref 和 reactive

ref和reactive是Vue3中用来实现数据响应式的API 一般情况下,定义基本数据类型,定义引用数据类型 ref本质上是reactive的再封装reactive定义引用数据类型(以对象和数组举例),它能够将复杂数据类型的内部属性或者数据项声明为响应式数据,所以reactive的响应式是深层次的,其底层是通过ES6的来实现数据响应式,相对于Vue2的,具有能监听增删操作,能监听对象属性的变化等优点使用reactive定义对象数据类型举例

七公子77的技术博客 2万+

华为OD机试 - 单词倒序(Python/JS/C/C++ 2025 A卷 100分)

华为OD机试 2025A卷题库疯狂收录中,刷题。

学Java,找哪吒 1226

vue3的ref,reactive的使用和原理解析

vue3新增了ref,reactive两个api用于响应式数据,Ref 系列毫无疑问是使用频率最高的 api 之一,响应式意味着数据变动,页面局部自动更新。

weixin_42974827的博客 1万+

USB_TYPE-C 母座电路设计

本文详细介绍了USB Type-C接口(C2765186)的电路设计要点,重点解析了电源、识别和数据三部分的关键连接方案。电源部分需并联VBUS和GND引脚并加宽走线以承载3A电流;识别部分必须为CC1/CC2引脚配置5.1kΩ±1%精度的下拉电阻,这是触发PD充电的核心条件;数据部分通过短接正反插引脚实现盲插功能。文档还提供了完整的引脚对照表,并强调PCB布局需注意ESD防护、差分走线阻抗控制等要点,为Type-C接口设计提供了实用指导。

在读研究生,FPGA电路设计与功能开发。 584

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Vue3 ref 和 reactive 的区别

Vue3 ref 和 reactive 的区别

我是 二川兄,对Web开发、GIS开发、3D模型、机器学习、面试技巧等方面都有一些涉猎~ 欢迎您加入技术交流圈!你可以在我的文章末尾找到我~ 7860

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

vue3中ref和reactive的区别

在 Vue3 的响应式系统中,ref 和 reactive 是最核心的两个 API,它们的区别是开发者必须掌握的底层原理。

qq_74114417的博客 5853

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

带你看懂vue3中最重要的API——ref和reactive

知识前景:假设你已了解vue3组合式API中,关于setup的知识。如果你刚开始学习,可以看看官方文档,或者我的这篇文章。 在vue3中,有两个重要的API——ref和reactive,这两个API你不懂其原理的话,可以说你没学好vue3。 但这两个API很难理解,已有vue2经验的我,整体过完vue3的文档后,感觉最难理解就是这两货,因为这个涉及到很多底层知识:JS的数据类型、内存栈、Object.defineProperty、ES6的Proxy ,那么今天,我就带你来啃这块难啃的骨头。 .

qq_42365082的博客 1万+

关于 Vue3 响应式 API 以及 reactive 和 ref 的用法

这篇文章记录一下 Vue3 响应式的内容,其中还包括了 reactive 和 ref 的用法。响应式是一种允许以声明式的方式去适应变化的编程范例,接下来我们一起看看。

黛琳ghz的博客,期待你的关注。 5万+

vue3中ref及reactive的说明

关于ref及reactive的用法,还是要在开发中多多使用,遇到响应式失效问题,仔细研究,加强理解。

m0_72167535的博客 1552

详解vue3的ref和reactive

在Vue2中,我们使用的是Object.defineProperty()来实现响应式数据,而在Vue3中,Vue3的ref和reactive成为了Vue3的核心特性之一。它们提供了一种新的方式来实现响应式数据系统,使得Vue3更加高效和易于使用。Vue3的ref和reactive是Vue3的核心特性之一,它们让我们能够轻松地构建出高效、可维护的Vue3应用程序。通过使用computed和watch,我们可以让Vue3更加智能地更新UI。如果你想要了解更多关于Vue3的内容,请查看Vue3的官方文档。

一个努力不被优化的程序员 2652

vue3中的ref与reactive

vue3中ref与reactive记忆

2301_82253033的博客 3967

vue3-ref 和 reactive

vue3-ref 和 reactive

m0_51244077的博客 2478

Vue 3中ref和reactive的区别

本文将详细介绍Vue 3中ref和reactive的区别,探讨它们的使用场景和优缺点。ref和reactive是Vue 3中实现响应式数据的两种方法,各有优缺点。了解它们的区别,有助于我们在实际项目中根据需求选择合适的方法。

你若盛开,清风自来 2485

vue3的ref和reactive的用法和解析

vue3的ref和reactive的用法和解析

qq_70703397的博客 5893

【Vue3笔记】Ref和Reactive

Ref会在一定条件下调用reactive,reactive会使用proxy代理输出响应式对象。因此,响应式其实是由Proxy代理实现的,这也是Vue3的响应式原理。注意,Vue2不一样,采用 Object.defineProperty()的get()与set()来实现响应式。Ref支持基本数据类型和引用数据类型,reactive只支持引用数据类型。

m0_52430898的博客 973
上一篇: 【Vue3基础】Vue3中的 computed、watch 和 watchEffect
下一篇: 【Vue3基础】Vue3 组件间通信
cannotbecounted
博客等级 码龄7年 101粉丝 59原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值