Vue3中定义变量是选择ref还是reactive?

Ref 与reactive

在 Vue 3 中,reactiveref 是用于创建响应式数据的两个不同的 API。它们都是 Vue 3 Composition API 的一部分。

ref

ref 用于创建一个包装基本数据类型的响应式对象。它接受一个初始值,并返回一个包含 value 属性的对象。ref 主要用于包装基本数据类型,如数字、字符串等。

import { ref } from 'vue';const count = ref(0);// 读取值
console.log(count.value); // 输出: 0// 修改值
count.value += 1;
console.log(count.value); // 输出: 1

reactive

reactive 用于创建一个包装普通对象的响应式对象。它接受一个普通对象,并返回一个代理对象,该代理对象中的属性都是响应式的。

import { reactive } from 'vue';const user = reactive({name: 'John',age: 30,
});// 读取值
console.log(user.name); // 输出: John// 修改值
user.age += 1;
console.log(user.age); // 输出: 31

区别:

  1. 数据类型:

    • ref 主要用于包装基本数据类型,如数字、字符串等。
    • reactive 主要用于包装普通对象。
  2. 访问属性:

    • ref 中,你需要通过 .value 访问和修改值。
    • reactive 中,直接访问和修改对象的属性即可。
  3. 用例:

    • ref 通常用于单一值,如计数器、标志等。
    • reactive 通常用于包装对象,用于表示具有多个属性的数据。
import { ref, reactive } from 'vue';// 使用 ref
const count = ref(0);
count.value += 1;// 使用 reactive
const user = reactive({name: 'John',age: 30,
});
user.age += 1;

为什么同时存在 ref()、reactive()?

refreactive 虽然都用于创建响应式对象,但它们在设计和用途上有一些区别,适用于不同的场景。理解这些差异有助于更好地选择合适的 API。

  1. 单一值 vs. 对象:

    • ref 主要用于包装基本数据类型,如数字、字符串等,以及需要单一值的情况。
    • reactive 用于包装普通对象,对于需要表示多个属性的数据结构。
    const count = ref(0); // 单一值
    const user = reactive({ name: 'John', age: 30 }); // 对象
    
  2. 访问方式:

    • ref 中,你需要通过 .value 访问和修改值。
    • reactive 中,直接访问和修改对象的属性即可。
    // 使用 ref
    count.value += 1;// 使用 reactive
    user.age += 1;
    
  3. 响应式原理:

    • ref 通过 Vue 3 提供的 ref 函数实现,它为基本数据类型提供了轻量级的响应式封装。
    • reactive 通过 Vue 3 提供的 reactive 函数实现,它使用 Proxy 对象来实现对整个对象的深层次响应式封装。
  4. 用例和场景:

    • ref 适用于简单的值或在模板中需要直接使用的值。
    • reactive 适用于表示复杂数据结构,需要处理多个属性的情况,尤其是在逻辑层面需要进行深层次的数据操作时。
import { ref, reactive } from 'vue';// 使用 ref
const count = ref(0);
count.value += 1;// 使用 reactive
const user = reactive({ name: 'John', age: 30 });
user.age += 1;

虽然在某些简单的场景中使用 ref 就足够了,但当处理更复杂的数据结构时,尤其是需要进行深层次的数据操作时,reactive 提供了更强大的功能。选择使用哪个 API 取决于你的具体需求和项目的复杂性。

ref与普通变量的区别

ref 在 Vue 3 的 Composition API 中被引入,它主要用于创建响应式对象,尤其是用于包装基本数据类型的响应式对象。相比于普通变量,ref 具有一些特别的支持和行为:

  1. 响应式变化检测:

    • ref 创建的对象是响应式的,意味着当其值发生变化时,相关的视图会进行更新。
    • 普通变量在 Vue 2 中没有内置的响应式支持,需要使用 Object.definePropertyVue.set 手动进行响应式处理。
  2. .value 访问和修改:

    • 在使用 ref 创建的响应式对象中,需要通过 .value 访问和修改值。

    • 这是因为 ref 的设计初衷是为了确保在模板中使用变量时能够区分变量本身和它的值。因此,直接操作 ref 对象会导致一些问题,必须使用 .value

      const count = ref(0);
      console.log(count.value); // 读取值
      count.value += 1; // 修改值
      
  3. 自动解包:

    • 在模板中使用 ref 变量时,Vue 3 会自动解包,直接访问变量值,而不需要显式使用 .value

    • 这样可以在模板中获得更自然的语法。

      <!-- 在模板中自动解包 -->
      <template><div>{{ count }}</div>
      </template>
      
  4. ref 函数:

    • ref 函数是 Vue 3 提供的 API,用于创建一个包装基本数据类型的响应式对象。这个函数的使用方式使得 Vue 能够更轻松地追踪数据的变化。
    • 普通变量在 Vue 2 中不具备这种直接的响应式支持,需要额外的处理来使其响应式。

注意
在 Vue 3 中当你将 ref 对象传递到模板(<template>)中时,会自动解包,无需额外使用 .value。这是 Vue 3 的一个改进,旨在提供更自然的语法。

以下是一个示例,演示了在模板中传递和使用 ref 对象的情况:

<!-- ParentComponent.vue -->
<template><div><p>Parent Component: {{ myRef }}</p><ChildComponent :childRef="myRef" /></div>
</template><script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent,},setup() {const myRef = ref('Hello from Parent');return {myRef,};},
};
</script>
<!-- ChildComponent.vue -->
<template><div><p>Child Component: {{ childRef }}</p><button @click="updateValue">Update in Child</button></div>
</template><script>
import { defineComponent } from 'vue';export default defineComponent({props: {childRef: {type: Object,required: true,},},methods: {updateValue() {// 在子组件中通过 .value 修改值this.childRef.value = 'Updated in Child';},},
});
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/191608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Effective C++(一): Const Correctness, Const成员函数和Const Cast

文章目录 一、Const成员函数二、Const Correctness三、Const Cast 有关 const 的用法是 cpp 中一个非常经典且易错的部分&#xff0c;在面试和日常工作中各种各样的 const 经常让人摸不着头脑&#xff0c;今天就来根据 const 扮演的不同角色来归纳有关 const 的不同用法 一、C…

泊车功能专题介绍 ———— 汽车全景影像监测系统性能要求及试验方法(国标未公布)

文章目录 术语和定义一般要求功能要求故障指示 性能要求响应时间图像时延单视图视野范围平面拼接视图视野平面拼接效果总体要求行列畸变拼接错位及拼接无效区域 试验方法环境条件仪器和设备车辆条件系统响应时间试验图像时延试验单视图视野范围试验平面拼接视图视野试验平面拼接…

Ubuntu 22.04安装Go 1.21.4编译器

lsb_release -r看到操作系统版本是22.04,uname -r看到内核版本是uname -r。 sudo wget https://studygolang.com/dl/golang/go1.21.4.linux-amd64.tar.gz下载编译器。 sudo tar -zxf go1.21.4.linux-amd64.tar.gz -C /goroot将文件解压到/goroot目录下&#xff0c;这个命令…

生成带依赖Jar 包的两种常用方式:IDEA打包工具:Artifacts 和 maven-shade-plugin

文章目录 前言1、IDEA打包工具&#xff1a;Artifacts1.1 创建Artifacts1.2 选择第三方jar文件1.3 打包Artifacts1.4 测试jar包 2、maven-shade-plugin2.1、pom文件添加2.2、打包2.3、测试jar包 总结 前言 当我们编写完Java程序后&#xff0c;为了提高执行效率通常会将应用程序…

冒泡排序详解

1.引入 当我们创建一个数组时&#xff0c;我们可能会发现这个数组的元素顺序可能不固定&#xff0c;这个时候就需要我们给数组排序&#xff0c;给数组排序的方法有很多种&#xff0c;这里今天我们先来介绍一下最简单的一种排序方法&#xff0c;即冒泡排序。 冒泡排序顾名思义&a…

vscode配置c++环境

我现在觉得vscode确实很好用&#xff0c;所以python和c都是用的这个。 首先是安装vs&#xff1a; 官网寻找即可&#xff1a;https://code.visualstudio.com/ 安装好后需要装一些插件&#xff1a; 装上这两个插件&#xff0c;c/c&#xff0c;code runner 接着安装c编译器mi…

canvas基础:绘制虚线

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

一些常见的爬虫库

一些常见的爬虫库&#xff0c;并按功能和用途进行分类&#xff1a; 通用爬虫库&#xff1a; Beautiful Soup&#xff1a;用于解析HTML和XML文档&#xff0c;方便地提取数据。Requests&#xff1a;用于HTTP请求&#xff0c;获取网页内容。Scrapy&#xff1a;一个强大的爬虫框架…

Python爬虫教程27:秀啊!用Pandas 也能爬虫??

说到爬虫&#xff0c;大家可能都知道requests、re、scrapy、selenium等等一些工具库。虽然它低调&#xff0c;但功能非常强大&#xff0c;用于抓取Table表格型数据时&#xff0c;简直是个神器&#xff0c;没有必要去F12研究HTML页面结构甚至写正则表达式解析字段。 #我的Pytho…

Python教程78:聊聊exec和eval()函数,有什么用法区别

exec 和 eval 是 Python 中的两个内置函数&#xff0c;它们都可以执行Python代码&#xff0c;但它们的使用方式和目的有所不同。 1.exec()函数用于执行动态的 Python 代码&#xff0c;你可以使用exec来执行存储在字符串或对象代码中的 Python 代码。exec 不会返回任何结果&…

BigDecimal

用于解决小数运算中&#xff0c;出现的不精确问题。 创建对象 new BigDecimal(double val)&#xff1a;不用&#xff0c;无法解决不精确问题。 new BigDecimal(String val)&#xff1a;推荐 BigDecimal.valueOf(double val)&#xff1a;推荐 常用方法 加法&#xff1a;add(Bi…

【嵌入式-51单片机】常见位运算和数据类型以及sbit使用

51单片机中 数据类型如下&#xff1a; 位运算符如下&#xff1a; 按位左移<<&#xff1a;低位补零&#xff0c;高位移出 按位右移>>&#xff1a;高位补零&#xff0c;低位移出 按位与&&#xff1a;对应位上的值必须同时为1才为1&#xff0c;可以用来对指定位…

【2023年修正版】哈夫曼编码详解

霍夫曼编码的原理就是根据字符的使用频率&#xff0c;排成二叉树&#xff0c;使用次数少的放到后面&#xff0c;使用次数多的离根节点越近&#xff1b;这样字符的占位也相应的较少。 首先&#xff0c;主要操作是找每次字符中使用频率最低的&#xff08;数最小&#xff09;两个数…

ASEM工控机维修工业电脑控制器维修PB3400

ASEM工控机维修asem工业电脑维修常见型号&#xff1a;PB3400;PB2000;PB3200;PB3600&#xff1b;BM2200等。 ASEM工控机维修常见故障有&#xff1a;开不了机、黑屏、不能启动、电路板故障、主板、开机没反应、显示器没反应、主板故障、蓝屏、卡机、显示器信号灯一直闪、系统不能…

180天Java从小白到就业-Day03-03Java位运算符、赋值运算符、数据交换的三种方式

1. 位运算符 Q&#xff1a;为什么要学习位运算 A&#xff1a;由于其运算效率更高&#xff0c;在JDK源码&#xff08;例如ArrayList、HashMap&#xff09;中大量使用位运算&#xff0c;想要看懂JDK源码必须懂位预算&#xff0c;但是在公司开发业务系统时位运算使用并不多。 Q…

java Lock锁的使用

Lock接口 public interface Lock { void lock(); void lockInterruptibly() throws InterruptedException; boolean tryLock(); boolean tryLock(long time, TimeUnit unit) throws InterruptedException; void unlock(); Condition newCondition(); }这 5 种方法分别是 lock(…

网络虚拟化场景下网络包的发送过程

网络虚拟化有和存储虚拟化类似的地方&#xff0c;例如&#xff0c;它们都是基于 virtio 的&#xff0c;因而在看网络虚拟化的过程中&#xff0c;会看到和存储虚拟化很像的数据结构和原理。但是&#xff0c;网络虚拟化也有自己的特殊性。例如&#xff0c;存储虚拟化是将宿主机上…

python绘制箱线图boxplot——用于多组数据的比较, 异常值检测

python绘制箱线图boxplot——用于多组数据的比较, 异常值检测 介绍箱线图方法简介箱线图适用范围seaborn.boxplot箱图外观设置异常值marker形状、填充色、轮廓设置完整代码 如下matplotlib.pyplot常见参数介绍 本文系统详解利用python中seaborn.boxplot绘制箱图boxplot。seab…

跟着chatgpt一起学|2.clickhouse入门(1)

上周我们一起学习了spark&#xff0c;这周让chatgpt帮我们规划下clickhouse的学习路径吧&#xff01; 目录 ​编辑 1.了解Clickhouse的基本概念 1.1 Clickhouse是什么&#xff1f; 1.2 ClickHouse的特点和优势 1.3 Clickhouse的基本架构与组件 1.了解Clickhouse的基本概念…

链式队列的结构设计及基本操作的实现(初始化,入队,出队,获取元素个数,判空,清空,销毁)

目录 一.链式队列的设计思想 二.链式队列的结构设计 三.链式队列的实现 四.链式队列的总结 一.链式队列的设计思想 首先一定要理解设计的初衷,就是队头队尾的位置要满足怎么快怎么设计.那么分析如下: 最终我们敲定了入队,出队的时间复杂度都为O(1)的一种设计,也就是第四种设…