【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

【数据分享】中国371个城市的坡度矢量数据和excel数据

在城市发展的进程中,地形地貌始终是影响规划决策的关键因素,而坡度作为表征地表倾斜程度的核心指标,更是贯穿于城市建设、生态保护等诸多环节。本文将全面解读中国 371 个城市坡度数据的相关情况,包括数据概况、生成流程、应用场景等内容,为读者呈现一份详尽的坡度数据指南。

qq_39719713的博客 1844

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

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

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

用Python实现四叉树(quad tree)

import numpy as np #正方形类 class square: #lx、ly为左上角坐标(x对应行号,y对应列号),rx、ry为右下角坐标 def __init__(self,lx,ly,rx,ry): self.lx=lx self.ly=ly self.rx=rx self.ry=ry #检查该矩阵中是否满足条件 #参数:原矩阵,阈值 #返回值:布尔类型 def check(s

weixin_44164489的博客 5868

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

五段式S型算法笔记

又因为有 v-v0= 0.5jt通式: 所以有 vm-v0= 0.5jtm 所以有4vm-4v0= 2jtm。算法1: v=2vm-v0-0.5*jt+2jt*tm-2jtm*tm。加加速度j 自己设置 已知,vmax自己设置已知;所以有4vm-4v0= 2jtm带入算法1。

qq_36658033的博客 681

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

【学习路线】 游戏客户端开发入门到进阶

游戏开发是一个交叉性极强的技术领域,对开发者提出了高维度的要求。作为初学者,不要急于求成,打牢基础、注重原理、勤于实践,你的成长将会非常快速而稳健。希望这份学习路线与书单能为你指明方向,迈出职业开发者的第一步。

hhw_hhw的博客 2128

如何绘制电气绝缘图(GB9706.1-2007和GB9706.1-2020差异)

是用来描述要考虑设备的绝缘状况和它们的值 ,从而便于和相关部门交流和沟通,如权威机构和检测实验室等。本文为绝缘图的实例, 包括所有相关的绝缘路径以及介电强度,爬电距离和电气间隙的值。

学海无涯的专栏 1万+

谈谈 Vue3 中的 ref 和 reactive

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

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

2026年华为od机试真题题库

OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)OD统一考试(E卷)

面试高手的博客 19万+

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

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

weixin_42974827的博客 1万+

MATLAB - Gazebo 联合仿真 —— 使用 UR10 机械臂检测和采摘水果

本示例演示如何在 Gazebo 物理模拟器中设置 Universal Robotics UR10 机械臂和仿真环境。您需要配置一个机器人从树上摘苹果的仿真环境。本示例演示如何利用这些工具箱,使用 Universal Robotics UR10 机械手模拟机器人检测并从树上摘取苹果。Robotics System Toolbox™ - 在 Simulink® 和 Gazebo 中对机械手进行建模、规划和模拟。Navigation Toolbox™ - 生成三维环境的占用图。

机器人控制与仿真应用 4182

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Vue3 ref 和 reactive 的区别

Vue3 ref 和 reactive 的区别

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

vue3中ref和reactive的区别

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

qq_74114417的博客 5853

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jre9下载 jdk9

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

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

余额充值