前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >6 个你必须明白 Vue3 的 ref 和 reactive 问题(入门篇)

6 个你必须明白 Vue3 的 ref 和 reactive 问题(入门篇)

原创
作者头像
pingan8787
发布于 2022-08-03 23:43:13
发布于 2022-08-03 23:43:13
2.2K0
举报
文章被收录于专栏:前端自习课前端自习课

Vue3 为开发者提供 refreactive两个 API 来实现响应式数据,这也是我们使用 Vue3 开发项目中经常用到的两个 API。

本文从入门角度和大家介绍这两个 API,如果有错误,欢迎一起讨论学习~

本文演示代码是基于 Vue3 setup 语法。

在入门阶段,我们需要掌握的是「是什么」、「怎么用」、「有什么注意」,基本就差不多了。

1. reactive API 如何使用?

reactive方法用来创建响应式对象,它接收一个对象/数组参数,返回对象的响应式副本,当该对象的属性值发生变化,会自动更新使用该对象的地方。

下面以分别以对象数组作为参数演示:

代码语言:typescript
AI代码解释
复制
import { reactive } from 'vue'

let reactiveObj = reactive({ name : 'Chris1993' });
let setReactiveObj = () => {
  reactiveObj.name = 'Hello Chris1993';
}

let reactiveArr = reactive(['a', 'b', 'c', 'd']);
let setReactiveArr = () => {
  reactiveArr[1] = 'Hello Chris1993';
}

模版内容如下:

代码语言:html
AI代码解释
复制
<template>
  <h2>Vue3 reactive API Base</h2>
  <div>
    Object:{{reactiveObj.name}} 
    <span @click="setReactiveObj">Update</span>
  </div>
  <div>
    Array:{{reactiveArr}} 
    <span @click="setReactiveArr">Update</span>
  </div>
</template>

此时页面展示如下:

image1.png
image1.png

当我们分别点击 Update按钮后,可以看到数据变化后,视图上内容也一起更新了:

image2.png
image2.png

2. ref API 如何使用?

ref 的作用就是将一个原始数据类型(primitive data type)转换成一个带有响应式特性的数据类型,原始数据类型共有7个,分别是:String/ Number /BigInt /Boolean /Symbol /Null /Undefined

ref的值在 JS/TS 中读取和修改时,需要使用 .value获取,在模版中读取是,不需要使用 .value

下面以分别以字符串对象作为参数演示:

代码语言:typescript
AI代码解释
复制
import { ref } from 'vue'

let refValue = ref('Chris1993');
let setRefValue = () => {
  refValue.value = 'Hello Chris1993';
}
let refObj = ref({ name : 'Chris1993' });
let setRefObj = () => {
  refObj.value.name = 'Hello Chris1993';
}

模版内容如下:

代码语言:html
AI代码解释
复制
<template>
  <h2>Vue3 ref API Base</h2>
  <div>
    String:{{refValue}} 
    <span @click="setRefValue">Update</span>
  </div>
  <div>
    Object:{{refObj.name}}
    <span @click="setRefObj">Update</span>
  </div>
</template>

此时页面展示如下:

image3.png
image3.png

当我们分别点击 Update按钮后,可以看到数据变化后,视图内容也一起更新了:

image4.png
image4.png

3. reactive 可以用在深层对象或数组吗?

答案是可以的reactive是基于 ES2015 Proxy API 实现的,它的响应式是整个对象的所有嵌套层级。

下面以分别以对象数组作为参数演示:

代码语言:typescript
AI代码解释
复制
import { reactive } from 'vue'

let reactiveDeepObj = reactive({
  user: {name : 'Chris1993'}
});
let setReactiveDeepObj = () => {
  reactiveDeepObj.user.name = 'Hello Chris1993';
}

let reactiveDeepArr = reactive(['a', ['a1', 'a2', 'a3'], 'c', 'd']);
let setReactiveDeepArr = () => {
  reactiveDeepArr[1][1] = 'Hello Chris1993';
}

模版内容如下:

代码语言:html
AI代码解释
复制
<template>
  <h2>Vue3 reactive deep API Base</h2>
  <div>
    Object:{{reactiveDeepObj.user.name}}
    <span @click="setReactiveDeepObj">Update</span>
  </div>
  <div>
    Array:{{reactiveDeepArr}}
    <span @click="setReactiveDeepArr">Update</span>
  </div>
</template>

此时页面展示如下:

image5.png
image5.png

当我们分别点击 Update按钮后,可以看到数据变化后,视图上内容也一起更新了:

image6.png
image6.png

4. reactive 返回值和源对象相等吗?

答案是不相等的,因为reactive是基于 ES2015 Proxy API 实现的,返回结果是个 proxy 对象。

测试代码:

代码语言:typescript
AI代码解释
复制
let reactiveSource = { name: 'Chris1993' };
let reactiveData = reactive(reactiveSource);

console.log(reactiveSource === reactiveData);
// false

console.log(reactiveSource);
// {name: 'Chris1993'}

console.log(reactiveData);
// Reactive<{name: 'Chris1993'}>

5. TypeScript 如何写 ref 和 reactive 参数类型?

在使用 TypeScript 写 ref / reactive 参数类型时,可以根据 ref / reactive 接口类型来实现具体的类型:

代码语言:typescript
AI代码解释
复制
function ref<T>(value: T): Ref<T>

function reactive<T extends object>(target: T): UnwrapNestedRefs<T>

将前面实例代码改造一下:

代码语言:typescript
AI代码解释
复制
import { ref } from 'vue'

let refValue = ref<string>('Chris1993');
// refValue 类型为: Ref<string>
let setRefValue = () => {
  refValue.value = 'Hello Chris1993'; // ok!
  refValue.value = 1993; // error!
}

// reactive也类似
let reactiveValue = reactive<{name: string}>({name: 'Chris1993'});

6. 把 ref 值作为 reactive 参数会怎么样?

当我们已有一个 ref对象,需要使用在 reactive对象中,会发生什么呢?

假设:

代码语言:typescript
AI代码解释
复制
let name = ref('Chris1993');
let nameReactive = reactive({name})

我们可以做下列操作:

代码语言:typescript
AI代码解释
复制
let name = ref('Chris1993');
let nameReactive = reactive({name})
console.log(name.value === nameReactive.name); // true

name.value = 'Hello Chris1993';
console.log(name.value);        // Hello Chris1993
console.log(nameReactive.name); // Hello Chris1993

nameReactive.name = 'Hi Chris1993';
console.log(name.value);        // Hi Chris1993
console.log(nameReactive.name); // Hi Chris1993

这是因为 reactive将会对所有深层的 refs进行解包,并且保持 ref的响应式。

当通过赋值方式将 ref分配给 reactive属性时,ref也会自动被解包:

代码语言:typescript
AI代码解释
复制
let name = ref('Chris1993');
let nameReactive = reactive({})
nameReactive.name = name;

console.log(name.value);        // Chris1993
console.log(nameReactive.name); // Chris1993
console.log(name.value === nameReactive.name); // true

7. 总结

本文主要从入门角度和大家介绍reactive/ ref两个 API 的使用方式区别,还有使用过程中的几个问题。

简单总结一下:

  • reactive 一般用于对象/数组类型的数据,都不需要使用 .value
  • ref一般用于基础数据类型的数据,在 JS 中读取和修改时,需要使用 .value,在模版中使用时则不需要;
  • reactive 可以修改深层属性值,并保持响应;
  • reactive 返回值和源对象不同;
  • reactive的属性值可以是 ref值;

下一篇将和大家分享精通篇,欢迎大家期待。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue3基础ref,reactive,toRef ,toRefs 使用和理解
在 Vue 3 中,ref、reactive、toRef 和 toRefs 是用于响应式数据管理的重要工具。理解它们的使用方式和区别对于有效地利用 Vue 3 的响应式系统至关重要。以下是对这些工具的详细解释和示例。
肥晨
2024/08/27
7210
vue3基础ref,reactive,toRef ,toRefs 使用和理解
Vue2到Vue3,重学这5个常用的API
距离Vue3发布已经过去一年多时间了,从Vue2到Vue3是一个不小的升级,包括周边生态等。
玄姐谈AGI
2023/01/10
9170
Vue2到Vue3,重学这5个常用的API
重温:vue3之ref(vue3函数)
我们先可以把直接修改数据的代码注释掉,先给他打印一下要从页面显示的属性到底在什么位置:
淼学派对
2022/11/20
6730
重温:vue3之ref(vue3函数)
【BlogAdmin升级2】VUE3重点函数API说明
注意: 在template中执行使用数据,在脚本中需要访问 不管是简单类型还是对象都用数据.value就行调用
老张的哲学
2024/02/22
1300
【BlogAdmin升级2】VUE3重点函数API说明
升级 Vue3 大幅提升开发运行效率
作者:louiszhai,腾讯 IEG 前端开发工程师 Vue3 性能提升了 1.3~2 倍,SSR 性能提升了 2~3 倍,升级 Vue3 正是当下。 背景 原计划 2019 年发布的 Vue3,又经过一年的再次打磨,终于于去年 9 月正式发布。随后,不少 UI 组件库都积极参与适配,去年 12 月,Element-plus(Element-ui 官方升级版)也发布了 beta 版。 由于项目中用到了 Element-ui 组件,组件库未适配的情况下,不敢贸然升级 Vue3。Element-plus
腾讯技术工程官方号
2021/04/27
2K0
【Vuejs】1732- 详细聊一聊 Vue3 依赖注入
在 Vue.js 中,依赖注入[1](DI)是一种非常常见的跨组件传递数据的方法,它可以帮助我们更好地管理组件之间的依赖关系。本文将介绍 Vue3 中的依赖注入机制,包括 provide() 和 inject() 函数的使用方法、使用注意以及优缺点和适用场景等方面的内容。
pingan8787
2023/09/01
8730
【Vuejs】1732- 详细聊一聊 Vue3 依赖注入
深入理解 Vue3 中的 setup 函数
Options API 是 Vue.js 2.x 中使用的传统组件设计模式。它基于选项对象,将组件的数据、计算属性、方法、生命周期钩子等功能按照选项的形式进行组织。Options API 的特点包括:
小馒头学Python
2024/05/02
5802
深入理解 Vue3 中的 setup 函数
vue3的setup还能这么用?
接收一个props和context函数并且将setup内的内容通过return暴露给组件的其余部分。
inline705
2021/12/09
1.1K0
vue3的setup还能这么用?
vue3 day4
vue3中依然可以使用v2的配置方式来定义生命周期钩子,但是有两个生命周期更改了名字
花花522
2023/03/07
2810
vue3 day4
【Vue.js】934- 一文带你掌握Vue3新特性,再也不怕面试官啦
在Vue2.x时,我们要想给子组件传值,还得单独传入。Vue3.x直接以v-model:xxx形式传入参数,并且配合修饰符.sync进行数据同步更新。
pingan8787
2021/04/26
1.4K0
【Vue.js】934- 一文带你掌握Vue3新特性,再也不怕面试官啦
Vue3学习笔记 —— Composition API 快速入门
对比 Vue2 中 OPTIONS API,data 和 methods 的定义如下所示
Gorit
2021/12/08
5440
Vue3学习笔记 —— Composition API 快速入门
【初学者笔记】整理的一些Vue3知识点
拒绝标题党,哈哈哈,看完你就基本可以上手搞开发了,本文适合Vue初学者,或者Vue2迁移者,当然还是建议Vue3官网完全过一遍。不适合精通原理,源码的大佬们。
一尾流莺
2022/12/10
2.4K0
【初学者笔记】整理的一些Vue3知识点
Vue3 响应式 API 之 ref 和 reactive
Vue2 会遍历 data 中的所有属性,使用 Object.defineProperty 把每个 property 全部转为 getter/setter,getter 用来收集依赖,setter 用来执行 notify,发布更新事件。Vue2 对每个属性创建一个 Dep 对象,作为订阅发布模式的中间机构来收集依赖。Vue 追踪这些依赖,在其被访问和修改时通知变更。
青年码农
2022/12/13
9730
Vue3 响应式 API 之 ref 和 reactive
一口气复习完 Vue3 相关基础知识点
看完你就基本可以上手搞开发了,本文适合Vue初学者,或者Vue2迁移者,当然还是建议Vue3官网完全过一遍。不适合精通原理,源码的大佬们。
前端达人
2021/09/09
2.3K0
一口气复习完 Vue3 相关基础知识点
vue3简易入门剖析
,发音同 “veet”)是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:
张哥编程
2024/12/13
4520
vue3实战-完全掌握ref、reactive
知道大家使用 Vue3 的时候有没有这样的疑惑,“ref、rective 都能创建一个响应式对象,我该如何选择?”,“为什么响应式对象解构之后就失去了响应式?应该如何处理?” 今天咱们就来全面盘点一下 ref、reactive,相信看完你一定会有不一样的收获,一起学起来吧!
yyds2026
2022/11/01
3.6K0
Vue3 TypeScript 使用教程 - 实战 Vue3 element-plus 开发「待办清单」
本文完整版:《Vue3 TypeScript 使用教程 - 实战 Vue3 element-plus 开发「待办清单」》
蒋川@卡拉云
2022/05/27
2.1K0
Vue3 TypeScript 使用教程 - 实战 Vue3 element-plus 开发「待办清单」
【玩转全栈】----闹钟虐我千百遍?我虐 Vue3 如初恋!
块级作用域 是指变量的作用域限制在代码块内,通常由大括号 {} 包围,例如循环、条件语句或任何包含代码的语句块。
用户11404404
2025/02/08
750
【玩转全栈】----闹钟虐我千百遍?我虐 Vue3 如初恋!
Vue3.x相对于Vue2.x的变化
ps: 上图中,一种颜色代表一个功能,我们可以看到Options API的功能代码比较分散;Composition API则可以将同一个功能的逻辑,组织在一个函数内部,利于维护。
conanma
2021/11/03
9090
Vue3, setup语法糖、Composition API全方位解读
支持绑定多个v-model,v-model 是 v-model:modelValue 的简写
yyds2026
2022/09/26
3.2K0
相关推荐
vue3基础ref,reactive,toRef ,toRefs 使用和理解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档