一文了解vue3的toRef和toRefs?

news2024/11/23 21:43:20

文章目录

    • toRef / toRefs
    • 首先toRef的使用
    • toRefs的使用:
    • 总结

reactive定义对象类型

<template>
  <h3>姓名:{{ person.name }}</h3>
  <h3>年龄:{{ person.age }}</h3>
  <h3>薪资:{{ person.job.j1.salary }}</h3>
  <button @click="person.name += '!'">修改姓名</button>
  <button @click="person.age++">增长年龄</button>
  <button @click="person.job.j1.salary++">涨薪</button>
</template>
  
<script>
import { reactive } from "vue";
export default {
  setup() {
    let person = reactive({
      name: "张三",
      age: 18,
      job: {
        j1: {
          salary: 20,
        },
      },
    });
    return {
      person,
    };
  },
};
</script>
  
<style>
</style>

在这里插入图片描述
那可能会想到 我在return的时候,麻烦一些,

<template>
  <h3>姓名:{{ name }}</h3>
  <h3>年龄:{{ age }}</h3>
  <h3>薪资:{{ job}}</h3>
  <button @click="name += '!'">修改姓名</button>
  <button @click="age++">增长年龄</button>
  <button @click="job++">涨薪</button>
</template>
  
<script>
import { reactive } from "vue";
export default {
  setup() {
    let person = reactive({
      name: "张三",
      age: 18,
      job: {
        j1: {
          salary: 20,
        },
      },
    });
    return {
      name: person.name,
      age: person.age,
      job: person.job.j1.salary,
    }; 
  },
};
</script>

这样那我在模板中不是直接就用{{name}}完事,没错是可以的,但是问题来了,你修改数据的时候,你会发现你的UI没有跟新;
其实这已经是一个新的对象了,相当于进行了解构赋值,返回的对象已经不再是一个响应式对象了,而是一个新的普通对象,针对这个问题,toRef和toRefs来解决。

toRef / toRefs

作用
toRef 和 toRefs 可以用来复制 reactive 里面的属性然后转成 ref,而且它既保留了响应式,也保留了引用,也就是你从 reactive 复制过来的属性进行修改后,除了视图会更新,原有 ractive 里面对应的值也会跟着更新,它复制的其实就是引用 + 响应式 ref
不加 s 和 加 s 的区别就是这样:

toRef: 复制 reactive 里的单个属性并转成 ref
toRefs: 复制 reactive 里的所有属性并转成 ref

首先toRef的使用

接下来看 toRef的用法: 很明显实现了效果

<template>
  <h3>姓名:{{ name }}</h3>
  <h3>年龄:{{ age }}</h3>
  <h3>薪资:{{ salary }}</h3>
  <button @click="name += '!'">修改姓名</button>
  <button @click="age++">增长年龄</button>
  <button @click="salary++">涨薪</button>
</template>
  
<script>
import { reactive, toRef } from "vue";
export default {
  setup() {
    let person = reactive({
      name: "张三",
      age: 18,
      job: {
        j1: {
          salary: 20,
        },
      },
    });
    return {
      // toRef: 复制 reactive 里的单个属性并转成 ref
      //有了toRef后就可以在return中定义数据名称
      //在模板中就不用再繁琐的加对象名,模板中的修改也会影响到原对象。toRef(响应对象,该响应对象中的某个属性)
      name: toRef(person, "name"),
      age: toRef(person, "age"),
      salary: toRef(person.job.j1, "salary"),
    };
  },
};
</script>
  

结论: toRef用来给抽离响应式对象中的某一个属性,并把该属性包裹成ref对象,使其和原对象产生链接

然而,假如我们的对象中有几百个属性那怎么办,那不是得写疯了,从而toRefs就用到了

toRefs的使用:

toRefs: 复制 reactive 里的所有属性并转成 ref

<template>
  <h3>姓名:{{ name }}</h3>
  <h3>薪资:{{ job.j1.salary }}</h3>
  <button @click="name += '!'">修改姓名</button>
  <button @click="salary++">涨薪</button>
</template>
   
  <script>
import { reactive,toRefs } from "vue";
export default {
  //toRefs: 复制 reactive 里的所有属性并转成 ref 但是toRefs读取对象第一层数据
  //只接受一个参数,为reactive响应式对象
  //toRefs返回的响应式对象可以进行解构、扩展运算符等操作,而不会失去响应式
  setup() {
    let person = reactive({
      name: "张三",
      job: {
        j1: {
          salary: 20,
        },
      },
    });
    return {
    ...toRefs(person) //进行结构对象
    };
  },
};
</script>

为什么需要toRef和toRefs?
初衷: 在不丢失响应式的前提下,对对象数据进行解构
前提: 针对的是响应式对象,不是普通对象
结果: 不创造响应式,只延续响应式

总结

ref、toRef、toRefs 都可以将某个对象中的属性变成响应式数据

ref的本质是拷贝,修改响应式数据,不会影响到原始数据,视图会更新

toRef、toRefs的本质是引用,修改响应式数据,会影响到原始数据,视图会更新

toRef 一次仅能设置一个数据,接收两个参数,第一个参数是哪个对象,第二个参数是对象的哪个属性

toRefs接收一个对象作为参数,它会遍历对象身上的所有属性,然后挨个调用toRef执行

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

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

相关文章

微软发布了 97 个漏洞的补丁,包括主动勒索软件漏洞

今天是本月的第二个星期二&#xff0c;微软发布了另一组安全更新&#xff0c;修复了影响其软件的97 个漏洞&#xff0c;其中一个漏洞已被广泛用于勒索软件攻击。 97 个错误中有 7 个被评为严重&#xff0c;90 个被评为重要。有趣的是&#xff0c;其中 45 个缺陷是远程代码执行…

抽象简单web

由于js中for循环大致可以包含为 简单的遍历数组 遍历对象的属性 遍历字符串 多层循环 使用 break 和 continue 使用 for...of 遍历数组 使用 forEach 遍历数组 那么由于水平问题&#xff0c;将会一个个精通后才出一图流 简单的遍历数组 在进行实践前&#xff0c;需要简单了解…

Redis 7 事务、管道、发布订阅、主从、哨兵、集群

一、事务 1、简介 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c; 按顺序地串行化执行而不会被其他命令插入&#xff0c;不许加塞一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令 2、实战 常用命令 正…

(学习日记)2023.4.12

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

在线安装rancher2.4管理K8S集群并部署服务

条件&#xff1a; 1. 准备至少3台机器&#xff1b; 2. 三台机器需要有网络&#xff1b; 3. 安装rancher和K8S集群&#xff1b; # master节点 [rootlocalhost ~]# hostnamectl set-hostname k8s-master && bash [rootk8s-master ~]# hostname k8s-master [rootk8s-ma…

【面试】Mysql主键索引普通索引索引和唯一索引的区别是什么?

前言 在 MySQL 中, 索引是在存储引擎层实现的, 所以并没有统⼀的索引标准, 由于 InnoDB 存储引擎在 MySQL数据库中使⽤最为⼴泛, 下⾯以 InnoDB 为例来分析⼀下其中的索引模型.在 InnoDB 中, 表都是根据主键顺序以索引的形式存放的, InnoDB 使⽤了 B 树索引模型&#xff0c;所…

WAF攻防-信息收集识别被动探针代理池仿指纹白名单

文章目录信息收集常见检测&#xff1a;信息收集常见方法&#xff1a;信息收集-被动扫描-黑暗引擎&三方接口信息收集-工具扫描-Awvs&Xray&Goby内置信息收集常见检测&#xff1a; 1、脚本或工具速度流量快 2、脚本或工具的指纹被识别 3、脚本或工具的检测Payload 信…

013:Mapbox GL添加marker

第013个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加marker。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共70行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https://xiaozhu…

重装系统需要做的事

1 设置小鹤双拼 winr 输入regedit&#xff0c;定位到「计算机\HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHS」 右键新建新建字符串值 数值名称&#xff1a;UserDefinedDoublePinyinScheme0 数值数据&#xff1a;小鹤双拼2*iuvdjhcwfgxmlnpbksqszxkrltvyovt …

css 使用blur,实现背景色高斯模糊,但不影响背景上的内容

实现效果 实现原理 1.filter&#xff1a;blur() 2.伪元素设置&#xff0c;不影响子元素显示 <!-- 库位使用率 --><div class"bkPart statusPart"><div class"co-title">库位使用率</div><div class"pickPos"><…

【RocketMQ】顺序消息实现原理

全局有序 在RocketMQ中&#xff0c;如果使消息全局有序&#xff0c;可以为Topic设置一个消息队列&#xff0c;使用一个生产者单线程发送数据&#xff0c;消费者端也使用单线程进行消费&#xff0c;从而保证消息的全局有序&#xff0c;但是这种方式效率低&#xff0c;一般不使用…

CDH6.3.2大数据集群生产环境安装(九)之部署flink1.13.2客户端

添加flink用户(可选,这里是因为公司需要这个参数所以才添加;所有节点都添加上,省事) 29.1. 添加 useradd flink部署flink客户端 选择一个集群节点作为客户端部署节点,这里选择zcpt-prd-bigdata-worker-01节点 30.1. 上传资源 flink-1.13.2-bin-scala_2.12.tgz 30.2. 解压…

Docker容器的官方镜像仓库

一、 官方镜像仓库介绍 镜像仓库分类 公有仓库 私有仓库 官方镜像仓库属于公有仓库 网址: hub.docker.com 网站名称:dockerhub 注册邮箱 创建仓库 创建自己的仓库 登录仓库 web界面登录 linux命令行登录 直接docker login 输入用户名和密码 这个自己创建的存储库一…

PID控制算法基础知识

PID控制算法基础知识 本文为PID控制算法的基础介绍 文章目录PID控制算法基础知识一、算法概述二、控制器的P、I、D项总结一、算法概述 PID是一个闭环控制算法。要实现PID算法&#xff0c;必须在硬件上具有闭环控制&#xff0c;就是需要有反馈。例如控制一个电机的转速&#xf…

RabbitMQ基础核心概念

目标&#xff1a; 了解RabbitMQ的核心概念 学习步骤&#xff1a; 1、模型概念 2、Producer (生产者) 、 Consumer(消费者) 3、Exchange (交换机) 4、Queue (消息队列) 5、Broker&#xff08;服务节点&#xff09; 6、RabbitMQ的五种工作模式 一、模型概念 说白了&#xff0c;R…

OldWang带你了解MySQL(八)

文章目录&#x1f525;聚合函数&#x1f525;AVG 和 SUM 函数&#x1f525;MIN 和 MAX 函数&#x1f525;COUNT 函数&#x1f525;数据分组(GROUP BY)&#x1f525;在多列上使用分组&#x1f525;约束分组结果(HAVING)&#x1f525;子查询&#x1f525;单行子查询&#x1f525;…

4月数据结构面试复习

目录 字节数 (278条消息) 数据结构保研面试题整理&#xff08;自用&#xff09;_推免面试数据结构问题_乌鸡摸鱼的博客-CSDN博客 https://zhuanlan.zhihu.com/p/138046349https://zhuanlan.zhihu.com/p/255030352计算机数据结构面试常问问题&#xff08;适合考研复试&#xff…

Redis7

Redis之父安特雷兹 Redis7概述 Redis:Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c;是一个高性能的Key-Value数据库提供了丰富的数据结构&#xff0c;例如String、Hash、List、Set、SortedSet等等。数据是存在内…

云原生个人线路 Docker容器化

声明&#xff1a;此文章为博主个人学习记录&#xff0c;仅供学习和交流&#xff0c;如有侵权请联系博主。 Docker 基于Linux 内核的Cgroup&#xff0c;Namespace&#xff0c;以及Union FS等技术&#xff0c;对进程进行封装隔离&#xff0c;属于操作系统层面的虚拟化技术&#x…

Windows权限提升—MySQL数据库提权

Windows权限提升—MySQL数据库提权1. 前言2. 数据库提权介绍2.1. 常见数据库端口2.2. MySQL数据库提权条件2.3. MySQL数据库提权类型3. MySQL中UDF提权3.1. UDF提权介绍3.2. UDF提权思路3.3. UDF提权步骤3.3.1. 获取外连数据库3.3.1.1. 外连数据库3.3.1.2. 连接数据库3.3.1.3. …