vue3.0 toRef与toRefs

2023-11-16

toRef与toRefs

toRef

  • 作用:创建一个ref对象,其value值指向另一个对象中的某个属性。
  • 语法:const name = toRef(person,‘name’)
  • 应用:要将响应式中的某个属性单独提供给外部使用时。
  • 扩展:toRefs与toRef功能一致,但可以批量创建多个ref对象。

代码示例

<template>
  <h2>个人信息</h2>
  <p>姓名:{{ person.name }}</p>
  <p>姓名:{{ person.age }}</p>
  <p>工资:{{ person.job.salary.current }}</p>
  <button @click="person.age++">++</button>
  <button @click="person.job.salary.current++">++工资</button>
  <button @click="person.name += '!'">打招呼</button>
</template>

<script>
import { reactive } from "vue";
export default {
  setup() {
    const person = reactive({
      name: "张三",
      age: 18,
      job: {
        salary: {
          current: 20,
        },
      },
    });
    return {
      person,
    };
  },
};
</script>

先来看一个问题,如下修改为什么数据不是响应式的。

<template>
  <h2>个人信息</h2>
  <p>姓名:{{ name }}</p>
  <p>姓名:{{ age }}</p>
  <p>工资:{{ current }}</p>
  <button @click="age++">++</button>
  <button @click="current++">++工资</button>
  <button @click="name += '!'">打招呼</button>
</template>

<script>
import { reactive } from "vue";
export default {
  setup() {
    const person = reactive({
      name: "张三",
      age: 18,
      job: {
        salary: {
          current: 20,
        },
      },
    });
    return {
      name: person.name,
      age: person.age,
      current: person.job.salary,
    };
  },
};
</script>

在这里插入图片描述
通过一个例子可以说明这种情况

  <script>
      let person = {
        name: "张三",
        age: 18,
      };
      let p = new Proxy(person, {
        set(target, propName, value) {
          console.log(`${propName}被修改了`);
          Reflect.set(target, propName, value);
        },
      });
    </script>

在这里插入图片描述
这是正常的响应式。修改一下代码,再打印

  <script>
      let person = {
        name: "张三",
        age: 18,
      };
      let p = new Proxy(person, {
        set(target, propName, value) {
          console.log(`${propName}被修改了`);
          Reflect.set(target, propName, value);
        },
      });
      let name = p.name;
    </script>

在这里插入图片描述

打印后会发现,并没有打印代表响应式的一段关键console.log。name只是新定义的一个变量。写let name = p.name,实际上是let name = “张三”,是个普通的字符串,上面的vue中一段代码,其实就以下示例代码,说明了以上vue中为什么这样写,数据不是响应式的原因。

<script>
import { reactive } from "vue";
export default {
  setup() {
    const person = reactive({
      name: "张三",
      age: 18,
      job: {
        salary: {
          current: 20,
        },
      },
    });
    return {
      name: "张三",
      age: 18,
      current: 20,
    };
  },
};
</script>

toRef

<template>
  <h2>个人信息</h2>
  <p>姓名:{{ person.name }}</p>
  <p>姓名:{{ person.age }}</p>
  <p>工资:{{ person.job.salary.current }}</p>
  <button @click="person.age++">++</button>
  <button @click="person.job.salary.current++">++工资</button>
  <button @click="person.name += '!'">打招呼</button>
</template>

<script>
import { reactive, toRef } from "vue";
export default {
  setup() {
    const person = reactive({
      name: "张三",
      age: 18,
      job: {
        salary: {
          current: 20,
        },
      },
    });
    const name1 = person.name;
    console.log("---", name1);
    const name2 = toRef(person, "name");
    return {
      person,
    };
  },
};
</script>

在这里插入图片描述
toRef将普通的数据转换成Ref对象
在这里插入图片描述
修改代码如下,打印如下

<template>
  <h2>个人信息</h2>
  <p>姓名:{{ name }}</p>
  <p>姓名:{{ person.age }}</p>
  <p>工资:{{ person.job.salary.current }}</p>
  <button @click="person.age++">++</button>
  <button @click="person.job.salary.current++">++工资</button>
  <button @click="person.name += '!'">打招呼</button>
</template>

<script>
import { reactive, toRef } from "vue";
export default {
  setup() {
    const person = reactive({
      name: "张三",
      age: 18,
      job: {
        salary: {
          current: 20,
        },
      },
    });
    return {
      name: toRef(person, "name"),
      person,
    };
  },
};
</script>

显示正常
在这里插入图片描述
再来看一个例子和打印

<template>
  <h2>个人信息</h2>
  <p>姓名:{{ name }}</p>
  <p>姓名:{{ age }}</p>
  <p>工资:{{ current }}</p>
  <button @click="age++">++</button>
  <button @click="current++">++工资</button>
  <button @click="name += '!'">打招呼</button>
</template>

<script>
import { ref, reactive, toRef } from "vue";
export default {
  setup() {
    const person = reactive({
      name: "张三",
      age: 18,
      job: {
        salary: {
          current: 20,
        },
      },
    });
    return {
      name: ref(person.name),
      age: ref(person.age),
      current: ref(person.job.salary.current),
    };
  },
};
</script>

在这里插入图片描述
你会发现页面可以正常更新。
再来试验以下,实际更新情况

<template>
  <h2>个人信息{{person}}</h2>
  <p>姓名:{{ name }}</p>
  <p>姓名:{{ age }}</p>
  <p>工资:{{ current }}</p>
  <button @click="age++">++</button>
  <button @click="current++">++工资</button>
  <button @click="name += '!'">打招呼</button>
</template>

<script>
import { ref, reactive, toRef } from "vue";
export default {
  setup() {
    const person = reactive({
      name: "张三",
      age: 18,
      job: {
        salary: {
          current: 20,
        },
      },
    });
    return {
      person,
      name: ref(person.name),
      age: ref(person.age),
      current: ref(person.job.salary.current),
    };
  },
};
</script>

在这里插入图片描述
打印会发现,源数据没有发生变化,这种情况是因为
在这里插入图片描述
用toRef存在引用关系,在以上代码return时用Ref仅仅是修改自定义的(person.name,person.age,…)值,相当于复制源数据的name,age并修改,并不是修改源数据。
最终改成

<template>
  <h2>个人信息{{ person }}</h2>
  <p>姓名:{{ name }}</p>
  <p>姓名:{{ age }}</p>
  <p>工资:{{ current }}</p>
  <button @click="age++">++</button>
  <button @click="current++">++工资</button>
  <button @click="name += '!'">打招呼</button>
</template>

<script>
import { ref, reactive, toRef } from "vue";
export default {
  setup() {
    const person = reactive({
      name: "张三",
      age: 18,
      job: {
        salary: {
          current: 20,
        },
      },
    });
    return {
      person,
      name: toRef(person, "name"),
      age: toRef(person, "age"),
      current: toRef(person.job.salary, "current"),
    };
  },
};
</script>

在这里插入图片描述

toRefs

toRefs是可以批量处理属性

<template>
  <!-- <h2>个人信息{{ person }}</h2>
  <p>姓名:{{ name }}</p>
  <p>年龄:{{ age }}</p>
  <p>工资:{{ current }}</p> -->
  <button @click="age++">++</button>
  <button @click="current++">++工资</button>
  <button @click="name += '!'">打招呼</button>
</template>

<script>
import { reactive, toRefs } from "vue";
export default {
  setup() {
    const person = reactive({
      name: "张三",
      age: 18,
      job: {
        salary: {
          current: 20,
        },
      },
    });
    const a = toRefs(person);
    console.log("a", a);
    return {
      // person,
    };
  },
};
</script>

在这里插入图片描述
你会发现,返回的是一个ref对象,注意,最终return时不能直接return toRefs(person),必须通过…toRefs(person)结构,不然就是返回一个对象,是会报语法错误的。这样写的好处就是在模板中不用像ref,返回person,模板中也要用到person,更加方便一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3.0 toRef与toRefs 的相关文章

  • vue3+vite中报错Error: Module “path“ has been externalized for browser compatibility...

    前言 vue3 vite遇到的报错信息处理 报错信息 Uncaught in promise Error Module path has been externalized for browser compatibility Cannot
  • vue3.2结合element-plus实现一个全局分页组件

    最近开始学习vue3 0的api语法 通使用vue3 0 element plus搭建一个模板 把常用的组件封装一下 常用的分页组件 通过封装之后 粘贴复制 开箱即用 首先安装vue3 2版本和element plus 分页组件
  • 探究vite——新一代前端开发与构建工具(一)

    Vite 法语意为 快速的 发音 vit 是一种新型前端构建工具 能够显著提升前端开发体验 它主要由两部分组成 一个开发服务器 它基于 原生 ES 模块 提供了 丰富的内建功能 如速度快到惊人的 模块热更新 HMR 一套构建指令 它使用 R
  • vue-cli3.0 配置使用 less 全局样式

    在css样式文件夹中新增 global less 作为全局样式 在 main js 中通过 import 导入 可正常使用样式 但 global less 中定义的样式属性还不能全局使用 需通过以下方法配置 1 安装 style resou
  • vue3.0中全局注册组件版本1-官方

    前言 在对vue3 0的使用和学习中 发现了很多和以前不一样的方法 这里聊一聊vue3 0中给我们提供的全局的注册组件方法 官方文档 入口 目录 具体方法介绍 1 前提 返回一个提供应用上下文的应用实例 应用实例挂载的整个组件树共享同一个上
  • 关于前端框架vue2升级为vue3的相关说明

    一些框架需要升级 当前 202306 Vue 的最新稳定版本是 v3 3 4 Vue 框架升级为最新的3 0版本 涉及的相关依赖变更有 前提条件 已安装 16 0 或更高版本的Node js 摘 必须的变更 核心库vue 2 gt 3 路由
  • vue3+ts+setup获取全局变量getCurrentInstance

    前言 vue3的 setup中是获取不到this的 为此官方提供了特殊的方法 让我们可以使用this 达到我们获取全局变量的目的 但是在使用typescript的时候 就会有一些新的问题产生 这里来做一个整理 vue3官方提供的方法 1 引
  • vue3中界面使用router,以及使用watch来监听router的改变

    前言 众所周知 vue2中使用router非常简单 但是vue3中略微有些改变 这里来罗列下他的改变 1 路由跳转 vue2 this router push vue3 import useRouter from vue router co
  • vue3表格按需导出excel

    效果图展示 不要英文字段 excel内容展示 隐藏英文字段 首先安装xlsx依赖 npm install xlsx save export default imported as XLSX was not found in xlsx 当出现
  • vue3 使用QrCode生成二维码

    官网地址 QrCode官网 第一步 安装 npm install save qrcode vue 第二步 引入并注册 import QrcodeVue from qrcode vue export default defineCompone
  • vue3.0 nextTick

    将回调推迟到下一个DOM更新周期之后执行 在更改了一些数据以等待DOM更新后立即使用它 import createApp nextTick from vue 方式一 const app createApp setup const chang
  • vue3+vite的项目中实现右键事件的神器

    前言 vue3 vite的项目中实现右键事件的神器 imengyu vue3 context menu 实现效果 使用步骤 1 安装 npm cnpm pnpm yarn 都可以 装上下面插件 imengyu vue3 context me
  • vue3+vite中使用path-to-regexp以及相关的报错问题

    前言 path to regexp 该方法的作用是把字符串转为正则表达式 一般我们使用动态匹配路由的时候会用到这个 1 介绍path to regexp 更多点我查看 pathToRegexp pathToRegexp foo bar 打印
  • vue3实现鼠标左键拖拽画矩形框框选功能

    vue3 elementuiPlus 实现鼠标左键拖拽画矩形框 框选列表功能 仿照桌面框选功能 效果如图 vue3鼠标框选 代码
  • vue3+vite 全局组件注册与使用

    前言 vite和我们的webpack是不同的 这里没办法用require 但是他也有自己的引入文件的方法 是 import meta glob 实现效果 vite方法官方入口 功能 Vite 官方中文文档下一代前端工具链https cn v
  • 关于vue-cli 3版本做的改动,没有static文件夹,本地文件应放在哪儿,如何引用

    2 x版本 3 0版本 原来放在static下的文件 现在应该放在public文件夹下 原来的请求数据的写法 现在的写法 总结 vue3 0 对脚手架的结构和静态文件的引用方式都进行了简化
  • vue3.0 toRef与toRefs

    toRef与toRefs toRef 代码示例 toRef toRefs toRef 作用 创建一个ref对象 其value值指向另一个对象中的某个属性 语法 const name toRef person name 应用 要将响应式中的某
  • Vue3.0开发之整合vue-admin-template模板

    起源 vue admin template模板算是一个比较好的前端开发模板 不过作者好像没有出vue3 0版本的 所以刚好自己在学习vue3 0 就想到开发一个vue3 0的模板 当然大部分代码都是参照vue admin template模
  • Vue3快速上手

    Vue3快速上手 1 Vue3简介 2020年9月18日 Vue js发布3 0版本 代号 One Piece 海贼王 耗时2年多 2600 次提交 30 个RFC 600 次PR 99位贡献者 github上的tags地址 https g
  • React、Vue2.x、Vue3.0的diff算法

    前言 本文章不讲解 vDom 实现 mount 挂载 以及 render 函数 只讨论三种 diff 算法 VNode 类型不考虑 component functional component Fragment Teleport 只考虑 E

随机推荐

  • 深入分析父子线程、进程终止顺序不同产生的结果

    转自 http www jb51 net article 37374 htm 本篇文章是对父子线程 进程终止顺序不同产生的结果进行了详细的分析介绍 需要的朋友参考下 Linux下编程 线程 进程退出顺序问题纷纷扰扰 如果父进程 线程先于子进
  • 创建和管理 Windows Server 2019虚拟机

    1 VMware Workstation 虚拟机的网络模型 只安装虚拟机还是不够的 通常还需要虚拟机能与主机以及其他虚拟机进行通信 如大部分项目实训 都要通过在宿主机中安装 Windows Server 2019虚拟机 然后在宿主机与虚拟机
  • NPM常用命令

    npm install npm g 全局安装最新npm g所有地方都可以用 不用配置环境变量 npm install 下载的模块名 版本号 可以下载安装模块并安装指定的版本 npm config get registry 查看当前使用镜像
  • 经典算法题思路整理-Leetcode力扣经典算法题目整理

    自己能在面试中A4纸写出来的代码才是好代码 不要一味追求复杂度低的代码 如果写都写不出来更不用谈复杂度 第一遍先大概粗过一遍题目思路 第二遍再刷代码 标注出不熟悉的题目 隔天复习 加强记忆 数组 数学 字符串 链表 二叉树 回溯 搜索 动态
  • Python Matplotlib基本使用

    1 对坐标轴的操作 import matplotlib pyplot as plt plt figure num 1 x np linspace 0 np pi y sin np sin x plt plot x y sin 生成线段图 p
  • 使用Pytorch计算分类模型的混淆矩阵

    第一部分 基础原理 参考链接 1 使用pytorch和tensorflow计算分类模型的混淆矩阵 B站视频讲解 推荐博文 4 4 2分类模型评判指标 一 混淆矩阵 Confusion Matrix 第二部分 代码详解 1 YOLOV5 5
  • 真正的opencv配置,搞了好久。

    opencv VS2010 win7 64位 首先 opencv版本 vs版本 系统多少位都没关系 虽然系统是64位的 但是只要你想编写在32位上也可以跑的程序 那就按这个来就行 1 环境变量 新建环境变量例如opencv 然后在path里
  • python实现将给定列表划分为元素和大致相等的两个子列表

    假设现有列表 300 150 75 38 19 9 5 2 我想把它划分为两个子列表 并要求两个列表的元素和大致相等 应该如何做 这是一个很有意思的问题 我们期待的答案应该是 list1 300 list2 150 75 38 19 9 5
  • 接口测试面试题,等你来看

    1 你们公司的接口测试流程是 接口测试我们是在xx项目做的 主要有xx接口 xx接口等 1 首先是从开发那里拿到API接口文档 了解接口业务 包括接口地址 接口方式 入参 出参 token鉴权 返回格式等信息 2 然后使用postman或j
  • 人工智能---深度学习神经网络神经元的实现

    系列文章目录 人工智能 深度学习从感知机到神经网络 文章目录 系列文章目录 前言 一 神经元的组成 二 激活函数的实现 1 什么是激活函数 2 常见的激活函数 3 激活函数实现 三 神经元实现 1 初始化参数 2 权重设置 3 偏置设置 4
  • servlet和java区别_Java中Applet和Servlet之间的区别是什么

    在Java中 Applet和servlet的主要区别是 applet是在客户端计算机上执行的应用程序 Applet和servlet是小型Java程序或应用程序 但是它们之间存在着许多差异 本篇文章就给大家介绍Applet和servlet的区
  • 中标麒麟QT中qDebug无输出问题解决办法

    一 系统环境 中标麒麟V5 qt creator 4 3 1 qt5 qtbase 5 6 2 二 问题 代码中qDebug 函数无输出 但qInfo 和qWarning 有输出 创建一个test工程 使用qDebug 打印信息 但是没有任
  • 新冠肺炎国内外数据实时API接口

    这个是从丁香园和百度疫情获取的两套疫情数据 使用Springboot封装了一下 对外提供API接口 数据包括 国内疫情数据 全球疫情数据 疫情最新资讯 其中丁香园包含了各种JPG格式的图表 百度包含今日疫情热搜等 百度包含了疫情历史数据 具
  • 3.4 DML

    package com atguigu import org apache hadoop hbase Cell import org apache hadoop hbase CellUtil import org apache hadoop
  • 【python】python获取两个list交集

    获取两个list 的交集 方法一 a 2 3 4 5 b 2 5 8 tmp val for val in a if val in b print tmp 2 5 方法二 比方法一快 print list set a intersectio
  • js实现WebSocket 连接

    一 WebSocket 简单介绍 1 HTTP和WebSocket的区别 http 通信只能由客户端发起 WebSocket 服务器可以主动向客户端推送信息 客户端也可以主动向服务器发送信息 是真正的双向平等对话 属于服务器推送技术的一种
  • 崩坏3渠道服扫码登录桌面版的方法教程

    文章目录 一 渠道服分类 二 扫码登录方法 1 官服或手机有相应渠道服版本 2 B服 vivo oppo UC 小米 3 应用宝 QQ 微信 华为 魅族 三 注意事项及问题解决方法 一 渠道服分类 崩坏3rd 渠道服扫码登录桌面版方法 崩坏
  • 算法:多个无序数组合并排序

    思路1 先单独排序 再合并 注意 sorted函数是又返回值的 不改变原来list 注意 若是多个数组 则可以对其中所有第一个数进行再排序 def sort1 list1 list2 list1 sorted list1 list2 sor
  • 深度网络架构的设计技巧(三)之ConvNeXt:打破Transformer垄断的纯CNN架构

    单位 FAIR DenseNet共同一作 曾获CVPR2017 best paper UC伯克利 ArXiv https arxiv org abs 2201 03545 Github https github com facebookre
  • vue3.0 toRef与toRefs

    toRef与toRefs toRef 代码示例 toRef toRefs toRef 作用 创建一个ref对象 其value值指向另一个对象中的某个属性 语法 const name toRef person name 应用 要将响应式中的某