当前位置: 首页 > news >正文

【Vue3】理解toRef() 和 toRefs()

历史小剧场

知道可能面对的困难和痛苦,在死亡的恐惧中不断挣扎,却仍然能战胜自己,选择这条道路,这才是真正的勇气。----《明朝那些事儿》

前言

toRef 和 toRefs 是Vue3中的响应式转换工具函数

  • toRef: 不影响源对象的情况下,对属性进行单独的访问和修改。toRef函数正是为了解耦属性的关联,将属性转换为一个独立的ref对象。并且:两者之间同步更新。
  • toRefs: 在父组件向子组件传递属性时,需要将这些属性声明为响应式对象。但是,如果直接将整个响应式对象传递给子组件,子组件无法通过解耦或者直接访问每个属性。又或者是在单页面上数据双向绑定时在View层不想要写这个响应式对象点的形式而是直接访问属性。这时,toRefs函数就可以将整个响应式对象转换为一个普通对象,每个属性都是独立的ref对象,可以轻松解耦和访问这些属性。

案例

<!-- TestToRef.vue -->
<template><div><h1>info.name {{ name }}</h1><h1>nameRef.value {{ nameRef }}</h1><button @click="changInfoName">改变info.name</button><button @click="changNameRef">改变nameRef.value</button></div>
</template><script lang="ts">
import { reactive, toRef, toRefs } from 'vue';export default {setup() {const info = reactive({name: '章三',age: 25})const nameRef = toRef(info, 'name')console.log(nameRef.value)const infoRefs = toRefs(info)console.log(infoRefs)console.log({...infoRefs})const changInfoName = () => {info.name = '李四'}const changNameRef = () => {nameRef.value = '王五'}return {...infoRefs,nameRef,changInfoName,changNameRef}}
}
</script><style lang="scss" scoped></style>

在这里插入图片描述
在上面这个案例中:

  1. 当我们点击第一个按钮时,改变了源响应式对象里面的name属性,然后单独解耦出来的nameRef对象里的值同步变了。而当我们点击第二个按钮时,改变了单独解耦出来的nameRef对象里的值,然后源响应式对象里面的name属性也变了。这是toRef()函数在起作用
  2. 注意看代码里View层的代码,我们在插槽里直接写了源响应式对象里的两个属性值,直接解耦出来了。这是toRefs()函数在起作用

比较

相同点
  • toRef和toRefs都用于将响应式对象的属性转换为ref对象;
  • 转化后的属性仍然保持响应式,对属性的修改会反映到源响应式对象上;
  • 在script中访问和修改其值都需要通过.value进行
不同点
  • toRef修改的是对象的某个属性,生成一个单独的ref对象;
  • toRefs修改的是整个对象,生成多个独立的ref对象集合;
  • toRefs适用于在组件属性解耦或传递时使用;而toRef更适合提取单个属性进行操作。

相关文章:

  • ChatGPT-4o体验demo
  • Docker面试整理-如何管理Docker容器的安全?
  • 【python报错】TypeError: dict.get() takes no keyword arguments
  • 【C++面向对象编程】(二)this指针和静态成员
  • 【Bug】httpClient循环调用除首次外会报Forbidden postman上用同样的参数可以
  • 微信小程序基础工作模板
  • 网络安全实战基础——实战工具与攻防环境介绍
  • 小阿轩yx-iptables 防火墙
  • JUC并发编程第十章——Java对象内存布局和对象头
  • bpmn+vue 中文文档
  • Javaweb---HTTPS
  • 笔记:Mysql的安全策略
  • Meta Llama 3 RMSNorm(Root Mean Square Layer Normalization)
  • [每周一更]-(第100期):介绍 goctl自动生成代码
  • 【归档】git使用
  • JavaWeb(学习笔记二)
  • js对象的深浅拷贝
  • Python学习笔记 字符串拼接
  • quasar-framework cnodejs社区
  • React的组件模式
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 基于Android乐音识别(2)
  • 基于webpack 的 vue 多页架构
  • 浅谈web中前端模板引擎的使用
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 优化 Vue 项目编译文件大小
  • 智能合约Solidity教程-事件和日志(一)
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 移动端高清、多屏适配方案
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • # wps必须要登录激活才能使用吗?
  • #android不同版本废弃api,新api。
  • (4)(4.6) Triducer
  • (6)设计一个TimeMap
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (二)WCF的Binding模型
  • (翻译)terry crowley: 写给程序员
  • (南京观海微电子)——示波器使用介绍
  • (七)理解angular中的module和injector,即依赖注入
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十八)SpringBoot之发送QQ邮件
  • (四)鸿鹄云架构一服务注册中心
  • (四)软件性能测试
  • (一)UDP基本编程步骤
  • (源码分析)springsecurity认证授权
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .form文件_SSM框架文件上传篇
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • .net通过类组装数据转换为json并且传递给对方接口