vue3基础ref,reactive,toRef ,toRefs 使用和理解

news2024/11/30 6:41:49

在这里插入图片描述

文章目录

    • 一. `ref`
      • 基本用法
      • 在模板中使用
      • `ref` 与 `reactive` 的区别
      • 使用场景
    • 二. `reactive`
      • 基本用法
      • 在模板中使用
      • `reactive` 与 `ref` 的区别
      • 使用场景
      • 性能优化
    • 三. `toRef`
      • 基本用法
      • 示例
      • 在组件中的应用
      • 主要用途
      • 对比 `ref` 和 `toRef`
    • 四. `toRefs`
      • 基本用法
      • 示例
      • 在组件中的应用
      • 主要用途
      • 对比 `ref` 和 `toRefs`
    • 总结


在 Vue 3 中,refreactivetoReftoRefs 是用于响应式数据管理的重要工具。理解它们的使用方式和区别对于有效地利用 Vue 3 的响应式系统至关重要。以下是对这些工具的详细解释和示例。

一. ref

ref 是 Vue 3 中用于创建响应式数据的一种方法。它主要用于处理基本数据类型(如字符串、数字、布尔值)以及简单的对象和数组。ref 允许你将一个普通的值变成响应式的,这样当这个值改变时,所有依赖于它的组件或计算属性也会自动更新。

基本用法

  1. 创建响应式引用

    import { ref } from 'vue';
    
    const count = ref(0); // 创建一个初始值为0的响应式引用
    
  2. 访问和修改值

    count.value++; // 修改值
    console.log(count.value); // 访问值
    

    注意:ref 创建的响应式数据需要使用 .value 属性来访问和修改。

在模板中使用

在 Vue 组件的模板中,ref 对象可以直接使用,而不需要 .value

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0);

    const increment = () => {
      count.value++;
    };

    return { count, increment };
  }
};
</script>

refreactive 的区别

  • ref:适合用于基本数据类型(如字符串、数字、布尔值)。对于更复杂的数据结构,ref 也可以用于包装对象或数组,但在使用时需要通过 .value 访问内部数据。
  • reactive:用于创建一个响应式对象或数组,其中对象的每个属性都变成响应式的。reactive 更适合用于复杂的数据结构。

使用场景

  1. 简单的状态管理

    import { ref } from 'vue';
    
    const isLoggedIn = ref(false);
    const username = ref('');
    
  2. 计算属性

    import { ref, computed } from 'vue';
    
    const firstName = ref('John');
    const lastName = ref('Doe');
    
    const fullName = computed(() => `${firstName.value} ${lastName.value}`);
    
  3. 响应式的 DOM 操作

    import { ref } from 'vue';
    
    const isVisible = ref(true);
    

    在模板中:

    <template>
      <div v-if="isVisible">Hello, World!</div>
    </template>
    

二. reactive

reactive 是 Vue 3 中用于创建响应式对象的一个核心 API。与 ref 主要处理基本数据类型不同,reactive 主要用于将复杂的对象(如对象和数组)转换为响应式对象,从而使得对象内部的所有属性都具有响应性。这意味着,当对象的属性发生变化时,所有依赖于这些属性的组件或计算属性也会自动更新。

基本用法

  1. 创建响应式对象

    import { reactive } from 'vue';
    
    const state = reactive({
      count: 0,
      name: 'John',
      items: ['apple', 'banana']
    });
    
  2. 访问和修改属性

    state.count++; // 修改 count 属性
    state.name = 'Doe'; // 修改 name 属性
    state.items.push('orange'); // 修改 items 数组
    

    直接访问和修改 reactive 对象的属性时,无需使用 .value。属性会自动响应。

在模板中使用

在 Vue 组件的模板中,reactive 对象的属性可以直接使用:

<template>
  <div>
    <p>Count: {{ state.count }}</p>
    <p>Name: {{ state.name }}</p>
    <ul>
      <li v-for="item in state.items" :key="item">{{ item }}</li>
    </ul>
    <button @click="increment">Increment</button>
    <button @click="addItem">Add Item</button>
  </div>
</template>

<script>
import { reactive } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0,
      name: 'John',
      items: ['apple', 'banana']
    });

    const increment = () => {
      state.count++;
    };

    const addItem = () => {
      state.items.push('orange');
    };

    return { state, increment, addItem };
  }
};
</script>

reactiveref 的区别

  • reactive:用于创建响应式对象或数组,使对象的所有属性都变成响应式。适合用于管理复杂的数据结构和多个相关的状态。
  • ref:用于创建响应式的单一值或基本数据类型。适合用于简单的数据,如数字、字符串或布尔值。ref 也可以包装对象或数组,但在访问时需要通过 .value

使用场景

  1. 复杂的状态管理

    import { reactive } from 'vue';
    
    const state = reactive({
      user: {
        name: 'John',
        age: 30
      },
      todos: [
        { text: 'Buy groceries', done: false },
        { text: 'Clean the house', done: true }
      ]
    });
    
    // 修改嵌套对象的属性
    state.user.name = 'Doe';
    state.todos[0].done = true;
    
  2. 动态数组操作

    import { reactive } from 'vue';
    
    const state = reactive({
      items: ['apple', 'banana']
    });
    
    // 添加和删除数组元素
    state.items.push('orange');
    state.items.splice(1, 1); // 删除索引为1的元素
    
  3. 嵌套对象的响应式

    import { reactive } from 'vue';
    
    const state = reactive({
      user: {
        profile: {
          name: 'John',
          age: 30
        },
        settings: {
          theme: 'light'
        }
      }
    });
    
    // 修改嵌套属性
    state.user.profile.name = 'Doe';
    state.user.settings.theme = 'dark';
    

性能优化

  • 避免深层嵌套reactive 对象的嵌套层级过深可能会影响性能。在处理非常复杂的嵌套结构时,考虑将状态拆分成多个较浅的对象。
  • 只创建必要的响应式数据:将数据分为响应式和非响应式部分,避免将所有数据都转化为响应式,特别是当某些数据不会发生变化时。

三. toRef

toRef 是 Vue 3 中的一个实用工具函数,用于将普通对象的属性转换为响应式引用(ref)。这对于将嵌套对象或组件的响应式状态转换为单一的 ref 对象特别有用。

基本用法

toRef 将一个对象的特定属性转换为一个 ref 对象。ref 对象是 Vue 中用于创建响应式基本数据类型或对象的工具,它的 .value 属性持有实际的值,并且可以在模板中直接访问。

示例

假设你有一个响应式对象,你想将其中的某个属性单独提取为 ref,可以使用 toRef

import { reactive, toRef } from 'vue';

// 创建一个响应式对象
const state = reactive({
  count: 0,
  name: 'John'
});

// 将 state 对象中的 count 属性转换为 ref
const countRef = toRef(state, 'count');

// 使用 countRef
console.log(countRef.value); // 输出: 0
countRef.value++; // 修改 count 的值

// 更新后的值
console.log(state.count); // 输出: 1

在组件中的应用

toRef 在 Vue 组件中非常有用,尤其是在 setup 函数中。它允许你将响应式对象的属性以 ref 的形式暴露给模板或其他函数。

<template>
  <div>
    <p>Count: {{ countRef }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import { reactive, toRef } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0
    });

    // 将 count 属性转换为 ref
    const countRef = toRef(state, 'count');

    const increment = () => {
      countRef.value++;
    };

    return { countRef, increment };
  }
};
</script>

主要用途

  1. 解耦和重用

    • toRef 可以将响应式对象的单个属性转换为 ref,使得这些属性能够在组件中独立使用。这对于需要将某些属性传递给子组件或者进行解耦操作时特别有用。
  2. 简化组合式 API 的使用

    • 当使用组合式 API (setup 函数) 时,可能会需要将复杂的响应式对象中的某些属性单独处理。toRef 使得这个过程更加简洁明了。
  3. ref 配合使用

    • 将对象属性转化为 ref 可以在模板中直接使用,避免了使用 .value 的繁琐操作。

对比 reftoRef

  • ref:用于创建一个新的响应式引用,无论是基本数据类型还是对象。当用于对象时,ref 会创建一个新的响应式引用对象,该对象的 .value 属性持有实际值。

  • toRef:用于将现有响应式对象的单个属性转换为 ref。这不会创建新的对象,而是直接转换现有对象的属性为 ref,从而简化属性的管理和访问。

注意toRef 可以使你将 reactive 对象的属性提取为 ref,这样可以单独处理这个属性,并保持其响应性。

四. toRefs

toRefs 是 Vue 3 中的一个实用工具函数,用于将一个响应式对象的所有属性转换为 ref。这对于将一个响应式对象中的属性逐一转换为独立的 ref 对象,方便在组件的 setup 函数中使用非常有用。

基本用法

toRefs 函数接收一个响应式对象作为参数,并返回一个新的对象,其中的每个属性都是 ref 对象。这个新对象的属性保持了原有对象的属性名称,并且每个属性的值是对应的 ref 对象。

示例

假设你有一个响应式对象,并希望将它的属性逐一转换为 ref,可以使用 toRefs

import { reactive, toRefs } from 'vue';

// 创建一个响应式对象
const state = reactive({
  count: 0,
  name: 'John'
});

// 将响应式对象的属性转换为 ref
const { count, name } = toRefs(state);

// 使用转换后的 refs
console.log(count.value); // 输出: 0
console.log(name.value);  // 输出: 'John'
count.value++;            // 修改 count 的值

// 更新后的值
console.log(state.count); // 输出: 1

在组件中的应用

在 Vue 组件的 setup 函数中,toRefs 可以帮助将响应式对象的属性方便地暴露给模板:

<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Name: {{ name }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import { reactive, toRefs } from 'vue';

export default {
  setup() {
    const state = reactive({
      count: 0,
      name: 'John'
    });

    // 将响应式对象的属性转换为 ref
    const refs = toRefs(state);

    const increment = () => {
      refs.count.value++;
    };

    return { ...refs, increment };
  }
};
</script>

主要用途

  1. 解耦和重用

    • toRefs 可以将整个响应式对象的属性转换为 ref,使得这些属性可以独立使用。这对于需要将响应式对象的所有属性解耦并传递到模板中特别有用。
  2. 简化代码

    • 当你有一个响应式对象,使用 toRefs 可以避免手动将每个属性转换为 ref。这使得代码更加简洁和易读。
  3. 与模板配合

    • 在模板中使用 toRefs 转换后的属性时,可以直接访问这些属性,而无需再通过 .value 访问。这有助于保持模板的清晰性和简洁性。

对比 reftoRefs

  • ref:用于创建单个响应式引用,可以用于基本数据类型或对象。对于对象类型,ref 会创建一个新的响应式引用对象,该对象的 .value 属性持有实际值。

  • toRefs:用于将整个响应式对象的属性逐一转换为 ref。它返回一个新对象,其中的每个属性都是 ref 对象。这不会创建新的响应式对象,而是保持原有对象的结构,并将其属性转换为 ref

注意toRefsreactive 对象的每个属性转换为独立的 ref,这样每个属性都可以单独处理,并且保持响应性。

总结

  • ref:用于基本数据类型的响应式引用,访问和修改需要使用 .value
  • reactive:用于创建响应式对象或数组,直接访问和修改其属性。
  • toRef:将 reactive 对象的某个属性转换为 ref,适用于单个属性。
  • toRefs:将整个 reactive 对象的属性转换为 ref 对象,适用于需要解构响应式对象的场景。

这些工具在 Vue 3 的响应式系统中互相配合使用,可以帮助你更灵活地管理和使用响应式数据。

您好,我是肥晨。
欢迎关注我获取前端学习资源,日常分享技术变革,生存法则;行业内幕,洞察先机。

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

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

相关文章

盘点16个有名气的进销存软件,你听说过哪一款?

进销存系统不仅能实现采购、销售、库存的一体化管理&#xff0c;精确记录每一笔业务数据&#xff0c;还帮助企业实时掌握库存状况&#xff0c;避免缺货或积压&#xff0c;降低成本。同时&#xff0c;通过数据分析&#xff0c;进销存还为企业决策提供了有力支持&#xff0c;助力…

职升网:二级建造师延续注册需要啥资料?

延续注册 注册周期&#xff1a;有效期为3年 组织管理&#xff1a;省、自治区、直辖市建设行政主管部门 申请时间&#xff1a;初始注册期满 申请表&#xff1a;二级建造师延续注册申请表下载 延续注册条件&#xff1a; 注册有效期满需要继续执业的&#xff0c;应当在注册有…

Macos M1 IDEA本地调试 HBase 2.2.2

# 1. 前提 执行 mvn clean package assembly:single -DskipTests没问题&#xff0c;并在hbase-assembly/target目录下生成hbase-2.2.2-bin.tar.gz 文件夹 证明Maven 下载依赖没问题 1.1 报错 1 这里应该是报错找不到 com.google.protobuf:protoc:exe:osx-aarch_64:3.5.1 …

视频监控汇聚算法平台训练站车辆类型算法分析车辆类型检测应用方案

车辆类型检测算法是计算机视觉和深度学习技术在交通管理和智能车辆系统中的重要应用之一。这种算法通过自动分析和识别车辆图像&#xff0c;能够准确判断车辆的类型&#xff0c;如轿车、SUV、货车等。 运用方案 数据采集与预处理 采集包含车辆的图像或视频数据&#xff0c;包…

AI制作PPT软件哪个好?这个国产Gamma工具真心推荐!

各种AI工具层出不穷&#xff0c;尤其是办公领域&#xff0c;诞生了诸多可让办公提效的AI工具&#xff0c;如AI制作PPT软件&#xff0c;笔者亲自体验过多款AI制作PPT软件&#xff0c;在权衡多个维度之后&#xff0c;最终选择了博思AIPPT。 博思AIPPT&#xff0c;是新一代的AI制…

CAPL在创建套接字时不绑定端口号时需要注意的地方

在CAPL中我们使用UdpOpen()和TcpOpen()两个函数创建Socket套接字,传入IP地址和Port口绑定IP地址和Port口,作为发送报文时的源IP地址和源Port口。 如果对源IP地址和源Port口没有要求,不需要绑定IP地址和Port口,可以在调用UdpOpen()和TcpOpen()时传入0,如此套接字绑定的IP地…

Numpy基本操作

1.什么是Numpy NumPy 是一个用于 Python 编程语言的开源库&#xff0c;它的主要功能是支持大型多维数组和矩阵&#xff0c;并提供了大量的数学函数来操作这些数组。NumPy 是 Python 科学计算生态系统的核心组成部分之一&#xff0c;广泛应用于数据分析、科学计算、机器学习等领…

海运专线面对的难题主要有哪些?突破口在哪里?

随着跨境电商的不断发展&#xff0c;跨境海运收益增加的同时&#xff0c;也面临着不少难题。 一、高昂的运输成本 由于跨境运输涉及多个国家和地区的多个运输环节&#xff0c;包括起运国、中转国和目的国&#xff0c;因此运输费用、中转费用、保险费用等都会累加&#xff0c;…

视频编辑与制作软件哪个好 视频编辑与制作软件哪个好学

学习剪辑技术&#xff0c;就是在学视频编辑软件的用法。选择一款适合自己的视频编辑与制作软件&#xff0c;能让你少走很多弯路。优秀的视频编辑软件&#xff0c;不仅能让用户快速掌握视频编辑的基本操作&#xff0c;还可以激发用户的创作灵感。有关视频编辑与制作软件哪个好&a…

【Qt】 编辑框 | 按钮 | 坐标系 的 初步了解

文章目录 1. 编辑框图形化方式纯代码方式 2. 按钮图形化方式 3. 坐标系 1. 编辑框 这里以实现 hello world 为例 即 使用 编辑框 完成 Hello World 图形化方式 单行编辑框 QLineEdit 多行编辑框 QTextEdit 点击 widget.ui 并打开 调用 Qt designer 这个图形化工具 完成窗口…

生信分析入门:从基础知识到实践操作的全方位指南

随着生物学研究的数字化转型&#xff0c;生物信息学&#xff08;简称生信&#xff09;分析已经成为现代生命科学研究中的关键工具。对于刚开始接触生信分析的初学者来说&#xff0c;这个领域可能看起来复杂而陌生。然而&#xff0c;通过系统的学习和实践&#xff0c;生信分析可…

ISO 26262中的失效率计算:IEC 61709-Clause16_Relays

目录 概要 1 元器件分类和基准温度 2 失效率的计算 2.1 失效率预测模型 2.2 电应力系数 2.2.1 电应力区域划分 2.2.2 电应力系数选择 2.3 转换率系数 2.3.1 转换率系数计算 2.4 温度应力系数 2.4.1 温度应力系数计算模型 2.4.2 温度应力系数计算 概要 IEC 61709是…

百元蓝牙耳机哪一款好用?四款价格亲民高性价比耳机产品推荐

如果说当代最伟大的音频设备创新&#xff0c;蓝牙耳机绝对算得上是一款既便捷又实用的科技神器。它不需要繁琐的线路连接&#xff0c;只需要轻轻一戴&#xff0c;就能让你随时随地沉浸在高质量的音乐或通话体验中。最重要的是&#xff0c;它的无线设计让我们的生活更加自由无拘…

Opencv-C++笔记 (20) : 距离变换与分水岭的图像分割

文章目录 一、图片分割分水岭算法理解分水岭算法过程 二、距离变换与分水岭距离变换常见算法有两种分水岭变换常见的算法步骤 主要函数c代码四、结果展示 一、图片分割 图像分割(Image Segmentation)是图像处理最重要的处理手段之一 图像分割的目标是将图像中像素根据一定的规则…

linux定时自启动shell脚本

linux定时自启动shell脚本 前言操作问题 前言 需要设计一个脚本用来定时清理linux磁盘空间&#xff0c;自启动 操作 1.在指定目录编写shell脚本 给脚本加权限 chmod 755 origin_del.sh 或者 chmod x origin_del.sh 2.打开定时 执行 crontab -e 输入 0 0 * * * /home/o…

【极限性能,尽在掌控】ROG NUC:游戏与创作的微型巨擘

初见ROG NUC&#xff0c;你或许会为它的小巧体型惊讶。然而&#xff0c;这看似不起眼的机身内&#xff0c;蕴藏着游戏、创意的强大能量。 掌中风暴&#xff0c;性能无界 ROG NUC搭载英特尔高性能处理器&#xff0c;配合高速NVMe SSD固态硬盘以及可选的高端独立显卡&#xff08…

电子工程师必备:万用表测量电阻的正确方法

在电子学和电气工程领域&#xff0c;测量电阻是一项基本技能。无论是进行电路调试还是故障排除&#xff0c;了解如何使用万用表测量电阻都是至关重要的。下面就跟着道合顺来一起了解#万用表测量电阻的详细方法#指南。 一、理解电阻与万用表 什么是电阻&#xff1f; 电阻是导…

【python数据分析11】——Pandas统计分析(分组聚合进行组内计算)

分组聚合进行组内计算 前言1、groupby方法拆分数据2、agg方法聚合数据3、apply方法聚合数据4、transform方法聚合数据5 小案例5.1 按照时间对菜品订单详情表进行拆分5.2 使用agg方法计算5.3 使用apply方法统计单日菜品销售数目 前言 依据某个或者几个字段对数据集进行分组&…

Linux驱动开发基础(匹配详解)

所学来自百问网 目录 1. 简介 2. 函数路径 3. driver_override 4. 设备树匹配 5. id_table 6. name 7. 比较顺序 1. 简介 platform_device 与 platform_driver是挂载在platform_bus_type总线下的两条链表&#xff0c;通过分离的思想负责不同的功能实现&#xff0c;两者…

AMD巨资收购ZT Systems,加速AI芯片市场竞争

AMD大手笔收购&#xff0c;剑指AI芯片市场 AMD近期宣布了一项重大收购计划&#xff0c;将以49亿美元的价格收购服务器制造商ZT Systems。这是AMD自2022年收购Xilinx以来最大规模的一笔交易&#xff0c;旨在通过扩大AI芯片和硬件产品组合&#xff0c;进一步增强与英伟达在AI领域…