【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

C语言入门—初识C语言

一、C语言概述 1、什么是C语言 语言是用来交流沟通的,有一方说,有一方听。必须要两方参与。(自言自语的除外) 语言是人与人交流,而C语言是人与机器交流 语言有独特的语法规则和定义,双方必须遵循这些规则和定义才能实现真正的交流。 接下来首先了解下计算机的组成: 2、计算机介绍 2.1、计算机结构组成 2.2、计算机系统组成 2.3、程序的指令 指令是对计算机进行程序控制的最小单元 计算机的指令系统是指所有指令的集合 程序是指为完成某一项特定任务而用某种言语编写的一组指令序列 3、C语言发展历程 3.

jun319817的博客 1034

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

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

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

【Pico手势开发实战】基于SteamVR串流与MRTK3的跨平台交互方案

本文详细介绍了在Pico设备上,结合SteamVR串流与微软MRTK3框架,实现高效跨平台手势交互开发的完整方案。该方案通过在PC端运行Unity项目并串流至头显,利用MRTK3封装的手势识别与交互组件,大幅提升了开发调试效率与性能上限,并确保了未来向其他OpenXR设备的良好兼容性。

weixin_29001683的博客 216

技术指南| 叶绿体基因组高级分析全流程解析

本文详细解析了叶绿体基因组高级分析的全流程,包括实验设计、序列组装与注释、比较基因组分析、选择压力与功能进化等关键步骤。通过实战案例和技术技巧,帮助研究者掌握叶绿体基因组分析的核心方法,提升植物进化研究和系统学分析的效率与准确性。

weixin_33725239的博客 491

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

新手如何学习车载底层嵌入式软件开发(AutoSar)

汽车嵌入式开发

ACarSoft的博客 4219

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

脑电时频分析I:谱分析

1、EEG频带划分 自发的EEG活动在活体大脑中持续存在,通常通过频率进行分类(也叫神经振荡活动) 特定频段的脑活动,即节律性的活动,具有特定的头皮分布和生物学意义 最后还有一个γ波,主要是指30hz~100hz的一个波段,通常这个波段也包含了噪声唁电的成分,比较难提取处理,比较少用到这个波段 这个波段主要是有可能躯体感觉皮层,进行一个多通道的感觉输入的i信号处理,比如我们同时处理视觉和听觉信号的处理,而且γ波与我们记忆的形成有关 除此之外,还有一个特殊的波段,8~12hz的Mu波段主要是特指我们

Kobe123brant的博客 1万+

【人工智能】拒绝焦虑,理性突围:AI 时代 Java 工程师的职业重构与进化指南

摘要:在AI技术快速发展的背景下,Java工程师面临职业转型挑战。本文通过MECE原则解构工作内容,划分高替代风险区(如CRUD开发)、高增效潜能区(如逻辑优化)和高核心壁垒区(如架构设计),指出AI对不同任务的影响程度。从劳动经济学视角分析行业将呈现K型分化,初级执行者被替代,而精通AI协作的全栈工程师需求增长。文章强调警惕过度依赖AI导致认知能力退化,并提出转型路径:掌握AI驱动开发(AIDD)、深耕领域驱动设计(DDD)、拓展全流程能力及AI原生应用开发。最终结论指出,未来的核心竞争力在于结合AI工具

奶爸的编程之路,也就一周冷个三天 133

谈谈 Vue3 中的 ref 和 reactive

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

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

科技英语/专业英语——改错总结【2】

1.固定句式 make it + adj + 句子 例:These features make the electronic systems difficult to intercept this kind of signal. 正确形式:These features make it  difficult for the electronic systems  to intercept

MISAYAONE的博客 1732

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

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

weixin_42974827的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Vue3 ref 和 reactive 的区别

Vue3 ref 和 reactive 的区别

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

vue3中ref和reactive的区别

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

qq_74114417的博客 5853

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

带你看懂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、付费专栏及课程。

余额充值