Vue 3 中的 toRef 与 toRefs:使用与案例解析
在 Vue 3 的响应式系统中,toRef 和 toRefs 是两个非常实用的工具函数。它们主要用于将响应式对象的属性转换为单独的 ref,以便在模板或逻辑中更方便地使用。本文将详细介绍 toRef 和 toRefs 的用法,并通过一个老师信息的案例来演示它们的实际应用。
1. toRef 与 toRefs 的定义
1.1 toRef
toRef 用于从响应式对象中提取一个属性,并将其转换为一个 ref。这个 ref 会与源对象的属性保持同步。
import { reactive, toRef } from 'vue';const state = reactive({name: 'Alice',age: 30
});const nameRef = toRef(state, 'name'); // 将 state.name 转换为 ref
console.log(nameRef.value); // Alice
1.2 toRefs
toRefs 用于将整个响应式对象的所有属性转换为一个包含多个 ref 的对象。每个 ref 都会与源对象的对应属性保持同步。
import { reactive, toRefs } from 'vue';const state = reactive({name: 'Alice',age: 30
});const stateRefs = toRefs(state); // 将 state 的所有属性转换为 ref
console.log(stateRefs.name.value); // Alice
console.log(stateRefs.age.value); // 30
2. toRef 与 toRefs 的区别
| 特性 | toRef | toRefs |
|---|---|---|
| 作用对象 | 单个属性 | 整个对象的所有属性 |
| 返回值 | 单个 ref | 包含多个 ref 的对象 |
| 适用场景 | 需要提取单个属性时使用 | 需要解构或传递多个属性时使用 |
| 与源对象的关系 | 保持与源对象属性的响应式连接 | 保持与源对象所有属性的响应式连接 |
3. 案例:老师信息管理
假设我们有一个老师的信息对象,包含姓名、年龄和教授的课程。我们将使用 toRef 和 toRefs 来管理这些信息,并演示如何修改数据。
3.1 初始代码
<template><div><h2>老师信息</h2><p>姓名: {{ name }}</p><p>年龄: {{ age }}</p><p>课程: {{ course }}</p><button @click="updateTeacher">修改老师信息</button></div>
</template><script>
import { reactive, toRef, toRefs } from 'vue';export default {setup() {// 定义老师信息的响应式对象const teacher = reactive({name: '张老师',age: 40,course: '数学'});// 使用 toRef 提取单个属性const nameRef = toRef(teacher, 'name');// 使用 toRefs 提取所有属性const teacherRefs = toRefs(teacher);// 修改老师信息的函数const updateTeacher = () => {nameRef.value = '李老师'; // 修改姓名teacherRefs.age.value = 45; // 修改年龄teacher.course = '物理'; // 直接修改源对象属性};return {...teacherRefs, // 将 teacherRefs 解构到模板中updateTeacher};}
};
</script>
3.2 代码解析
-
toRef的使用:- 我们从
teacher对象中提取了name属性,并将其转换为nameRef。 - 修改
nameRef.value会同步更新teacher.name。
- 我们从
-
toRefs的使用:- 我们将
teacher对象的所有属性转换为teacherRefs。 - 在模板中通过解构
teacherRefs来访问name、age和course。 - 修改
teacherRefs.age.value会同步更新teacher.age。
- 我们将
-
直接修改源对象:
- 我们也可以直接修改
teacher.course,因为teacher本身是响应式的。
- 我们也可以直接修改
-
按钮点击事件:
- 点击按钮后,
name、age和course都会被修改,并触发视图更新。
- 点击按钮后,
4. 修改代码并说明关联关系
4.1 修改代码
假设我们需要添加一个功能:显示老师的教龄(teachingYears),并根据年龄动态计算教龄。
<template><div><h2>老师信息</h2><p>姓名: {{ name }}</p><p>年龄: {{ age }}</p><p>教龄: {{ teachingYears }}</p><p>课程: {{ course }}</p><button @click="updateTeacher">修改老师信息</button></div>
</template><script>
import { reactive, toRef, toRefs, computed } from 'vue';export default {setup() {const teacher = reactive({name: '张老师',age: 40,course: '数学'});const nameRef = toRef(teacher, 'name');const teacherRefs = toRefs(teacher);// 计算教龄const teachingYears = computed(() => teacher.age - 22);const updateTeacher = () => {nameRef.value = '李老师';teacherRefs.age.value = 45;teacher.course = '物理';};return {...teacherRefs,teachingYears,updateTeacher};}
};
</script>
4.2 关联关系说明
-
toRef和toRefs的作用:toRef和toRefs将响应式对象的属性转换为ref,使得我们可以更方便地在模板或逻辑中使用这些属性。- 它们与源对象保持响应式连接,修改
ref的值会同步更新源对象。
-
计算属性的使用:
- 我们使用
computed计算了teachingYears,它依赖于teacher.age。 - 当
teacher.age被修改时,teachingYears会自动更新。
- 我们使用
-
响应式数据的流动:
- 修改
nameRef.value→ 更新teacher.name→ 触发视图更新。 - 修改
teacherRefs.age.value→ 更新teacher.age→ 触发teachingYears重新计算 → 触发视图更新。 - 直接修改
teacher.course→ 触发视图更新。
- 修改
5. 总结
toRef:适合提取单个属性并保持与源对象的响应式连接。toRefs:适合解构整个响应式对象,方便在模板或逻辑中使用多个属性。- 关联关系:
toRef和toRefs创建的ref会与源对象保持同步,修改ref的值会触发视图更新。
通过本文的案例和代码示例,希望你能更好地理解 toRef 和 toRefs 的用法,并在实际项目中灵活运用它们来管理响应式数据!
相关文章:
Vue 3 中的 toRef 与 toRefs:使用与案例解析
在 Vue 3 的响应式系统中,toRef 和 toRefs 是两个非常实用的工具函数。它们主要用于将响应式对象的属性转换为单独的 ref,以便在模板或逻辑中更方便地使用。本文将详细介绍 toRef 和 toRefs 的用法,并通过一个老师信息的案例来演示它们的实际…...
问题修复记录:Linux docker 部署 dify,无法调用宿主机本地服务
重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...
代码随想录day20
235. 利用二叉搜索树的特性即可 /** lc appleetcode.cn id235 langcpp** [235] 二叉搜索树的最近公共祖先*/// lc codestart /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) :…...
【ProxyBroker】用Python打破网络限制的利器
ProxyBroker 1. 什么是ProxyBroker2. ProxyBroker的功能3. ProxyBroker的优势4. ProxyBroker的使用方法5. ProxyBroker的应用场景6.结语项目地址: 1. 什么是ProxyBroker ProxyBroker是一个开源工具,它可以异步地从多个来源找到公共代理,并同…...
分布式微服务系统架构第88集:kafka集群
使用集 群最大的好处是可以跨服务器进行负载均衡,再则就是可以使用复制功能来避免因单点故 障造成的数据丢失。在维护 Kafka 或底层系统时,使用集群可以确保为客户端提供高可用 性。 需要多少个broker 一个 Kafka 集群需要多少个 broker 取决于以下几个因…...
RocketMQ原理—5.高可用+高并发+高性能架构
大纲 1.RocketMQ的整体架构与运行流程 2.基于NameServer管理Broker集群的架构 3.Broker集群的主从复制架构 4.基于Topic和Queue实现的数据分片架构 5.Broker基于Pull模式的主从复制原理 6.Broker层面到底如何做到数据0丢失 7.数据0丢失与写入高并发的取舍 8.RocketMQ读…...
下载Visual Studio Community 2019
官方链接如下:Visual Studio Community 2019下载链接 https://learn.microsoft.com/zh-cn/visualstudio/releases/2019/system-requirements#download 目前官方仅建议2022版,已经关闭vs2019等旧版本,哪天开放了,记得踢我一下。 …...
一文简单回顾Java中的String、StringBuilder、StringBuffer
简单说下String、StringBuilder、StringBuffer的区别 String、StringBuffer、StringBuilder在Java中都是用于处理字符串的,它们之间的区别是String是不可变的,平常开发用的最多,当遇到大量字符串连接的时候,就用StringBuilder&am…...
27. C语言 强制类型转换详解
本章目录: 前言强制类型转换(Type Casting)强制类型转换的语法示例1:将整数转换为浮点数输出结果: 代码解析: 整数提升(Integer Promotion)示例2:整数提升输出结果: 代码…...
git困扰的问题
.gitignore中添加的某个忽略文件并不生效 把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效, gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。 解决方…...
反向代理模块。。
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
【Linux基础指令】第三期
近期更新的基础指令链接: 【Linux基础指令】第一期-CSDN博客 【Linux基础指令】第二期-CSDN博客 本期博客的主题依旧是 "基础指令" ;话不多说,正文开始。 一、Linux的指令 1.zip / unzip 功能:打包压缩 命令格式&…...
Jenkins安装部署(以及常见报错解决方案),jdk版本控制器sdkman
目录 零、环境介绍 一、Jenkins安装 1、插件安装以及更换插件源 2、修改jenkins时区 二、sdkman安装(可选) 1、sdkman常用方法 2、sdkman常用方法演示 2.1、查看可用的jdk 2.2、下载jdk并切换版本 三、jenkins报错解决 1、下载sdkman后systemc…...
利用JSON数据类型优化关系型数据库设计
利用JSON数据类型优化关系型数据库设计 前言 在关系型数据库中,传统的结构化存储方式要求预先定义好所有的列及其数据类型。 然而,随着业务的发展,这种设计可能会显得不够灵活,尤其是在需要扩展单个列的描述功能时。 JSON数据…...
Nxopen 直齿轮参数化设计
NXUG1953 Visualstudio 2019 参考论文: A Method for Determining the AGMA Tooth Form Factor from Equations for the Generated Tooth Root Fillet //FullGear// Mandatory UF Includes #include <uf.h> #include <uf_object_types.h>// Internal I…...
线程配置经验
工作时,时常会遇到,线程相关的问题与解法,本人会持续对开发过程中遇到的关于线程相关的问题及解决记录更新记录在此篇博客中。 目录 一、线程基本知识 1. 线程和进程 二、问题与解法 1. 避免乘法级别数量线程并行 1)使用线程池…...
火语言RPA--KimiAiFree服务
🚩【组件功能】:KimiAiFree服务支持联网搜索、支持智能体对话、支持长文档解读、支持图像OCR。 配置预览 配置说明 服务地址 支持T或# 自行搭建或第三方提供的KimiAiFree服务地址。 RefreshToken 支持T或# 与KimiAiFree服务交互时用到的token。从ki…...
P6120 [USACO17JAN] Hoof, Paper, Scissor S
难度:普及/提高−; 题意: 石头、剪刀、布游戏,先给出 n n n 轮已经知道的其中一人的对局情况,例如样例: 5 P - 布 P - 布 H - 石头 P - 布 S - 剪刀另外一人,只允许修改一次机会的情况下…...
Android Studio打包APK
1.导出APK安装包 如果是首次打包,Create new 单击蓝色对话框右边文件夹📂图标 ,选择密钥保存路径,然后在下方File name对话框中填写您想要名称,再点击OK回到密钥创建对话框。 在此对话框中填写密码(Passwo…...
08 比特币通用技术介绍
比特币分层 比特币区块结构 存储结构 区块是比特币存储交易的结构,一个区块总是指向其父节点。 一个区块包含三个字段:区块头、区块交易数量、交易列表。交易数量受到区块大小限制,输入、输出数量和脚本都会占用区块空间,矿工往…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
