vue3响应式工具 toRefs() 和 toRef()

Vue3 理解 toRef 和 toRefs 的作用、用法、区别 Vue3 轻松理解 toRef 和 toRefs 的作用、用法、区别,并举例一些简单案例。 阅读详情

前言

直接解构响应式对象的属性进行赋值给新的变量,会导致新变量失去响应式。
当修改新变量的值时,不会触发原始响应式对象的更新,从而在模板中也不会有相应的视图更新。

示例:

<template>
  <div>
    <p>姓名: {{ person.name }}</p>
    <p>年龄: {{ person.age }}</p>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
  </div>
</template>
<script setup lang="ts">
import { reactive } from 'vue';

// person是响应式对象
const person = reactive({
  name: '张三',   // person.name 是响应式的
  age: 36         // person.age 是响应式的
});
// person.name = '李四' 会触发响应式更新
// person.age = 24 会触发响应式更新

// 解构赋值
let { name, age } = person
// 语句相当于执行:let name = person.name; let age = person.age
// 修改name、age,person的name属性、age属性不会改变

const changeName = () => {
  name += '哈'  // name改变了,没有触发响应式更新
  console.log(`name: ${name}, person.name: ${person.name}`); 
}
const changeAge = () => {
  age ++   // age改变了,没有触发响应式更新
  console.log(`age: ${age}, person.age: ${person.age}`)  
}
</script>

控制台打印结果:
在这里插入图片描述
let { name, age } = person 相当于执行let name = person.name; let age = person.age,使用方法changeName、changeAge修改name、age,本质上修改的是使用let声明的name变量、age变量,person的name属性、age属性不会改变。因此不会触发响应式更新。

从响应式的数据person直接解构出来的name、age不是响应式的。

在 Vue 3 中,toRefs()和toRef()都是用于处理响应式对象的工具函数,它们的作用是将响应式对象中的属性转换为独立的响应式引用。主要用来取出响应式对象里的属性,或者解构响应式对象。

toRefs()

toRefs()将一个响应式对象转换为一个普通对象,这个普通对象的每个属性都是指向源对象相应属性的 ref。每个单独的 ref 都是使用 toRef() 创建的。

使用toRefs()函数来保持解构后的属性的响应式:

<template>
  <div>
    <p>姓名: {{ person.name }}</p>
    <p>年龄: {{ person.age }}</p>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
  </div>
</template>
<script setup lang="ts">
import { reactive, toRefs } from 'vue';

const person = reactive({
  name: '张三',
  age: 36
});

// 将响应式对象解构为响应式引用
let { name, age } = toRefs(person)
// 使用toRefs解构后,name、age都变成了使用ref()定义的响应式引用,指向原始响应式对象中的属性。

console.log('toRefs(person):', toRefs(person))
console.log('解构后的name:', name)
console.log('解构后的age:', age)

const changeName = () => {
  name.value += '哈'  // name改变了,触发响应式更新
  console.log(`name: ${name.value}, person.name: ${person.name}`); 
}
const changeAge = () => {
  age.value ++   // age改变了,触发响应式更新
  console.log(`age: ${age.value}, person.age: ${person.age}`); 
}
</script>

let { name, age } = toRefs(person);使用toRefs()将响应式对象person解构为name和age两个响应式引用:
在这里插入图片描述
通过 toRefs() 将 person 对象解构后得到的 name 和 age 是响应式引用,它们与原始对象 person 的对应属性保持着响应式的关联。
对name和age的修改会触发响应式更新,并且会同步到原始的响应式对象person中:
在这里插入图片描述
在模板中,可以使用响应式引用来访问和显示特定属性的值:

<template>
  <div>
    <p>姓名: {{ name }}</p>
    <p>年龄: {{ age }}</p>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
  </div>
</template>

在模板中直接使用 name 和 age 与使用 person.name 和 person.age 的效果是一样的,都能正确地展示响应式数据,并且在数据发生变化时自动更新视图。

toRefs() 在调用时只会为源对象上可以枚举的属性创建 ref。如果要为可能还不存在的属性创建 ref,请改用 toRef()。

toRef()

toRef()创建一个特定属性的响应式引用

  • toRef()接收一个响应式对象和一个属性名作为参数,并返回一个响应式引用,指向原始响应式对象中的特定属性。
  • 与toRefs()不同,它只创建一个特定属性的响应式引用。

示例:

<template>
  <div>
    <p>姓名: {{ name }}</p>
    <p>年龄: {{ age }}</p>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
  </div>
</template>
<script setup lang="ts">
import { reactive, toRef } from 'vue';

const person = reactive({
  name: '张三',
  age: 36
});

// 创建了一个名为 name 的响应式引用,指向 person 对象中的 name 属性
let name = toRef(person, 'name')
console.log(name)
// 创建了一个名为 age 的响应式引用,指向 person 对象中的 age 属性
let age = toRef(person, 'age')
console.log(age)

const changeName = () => {
  name.value += '哈'  // name改变了,触发响应式更新
  console.log(`name: ${name.value}, person.name: ${person.name}`); 
}
const changeAge = () => {
  age.value ++   // age改变了,触发响应式更新
  console.log(`age: ${age.value}, person.age: ${person.age}`); 
}
</script>

控制台打印结果:
在这里插入图片描述

toRef()可以将值、refs 或 getters 规范化为 refs (3.3+)

  • toRef()可以接受一个普通的值,并将其包装成一个响应式引用。
  • 也可以接受一个已有的ref对象,直接返回这个ref对象。
  • 还可以接受一个getter函数,将其返回值包装成一个响应式引用。
  • 返回值:返回一个新的ref对象,该对象指向原始响应式对象中的特定属性或者普通值、getter函数的返回值。

将普通值转换为响应式引用

<template>
  <div>
    <p>count: {{ count }}</p>
    <p>countRef: {{ countRef }}</p>
    <button @click="changeCount">点击修改count</button>
    <button @click="changeCountRef">点击修改countRef</button>
  </div>
</template>
<script setup lang="ts">
import { toRef } from 'vue';

// 定义一个普通变量count,初始值为 10
let count = 10
console.log('count: ',  count)

// 通过toRef转换把普通变量count为响应式引用countRef
let countRef = toRef(count)
console.log('countRef: ', countRef)

const changeCount = () => {
  count++   // count改变了,但不会触发响应式更新
  console.log('changeCount()---count:', count)
}
const changeCountRef = () => {
  // 修改响应式引用countRef.value的值,触发响应式更新
  // 同时也会更新原始的普通变量count的值
  // 会触发count、countRef的响应式更新
  countRef.value++ 
  console.log('changeCountRef()---countRef: ', countRef)
}

</script>

执行changeCount,count的值改变了,但页面显示仍然是初始值10,不会触发响应式更新:
在这里插入图片描述
执行changeCountRef,通过修改响应式引用countRef.value的值,触发响应式更新。会触发count、countRef的响应式更新:
在这里插入图片描述
在这个例子中,toRef()将普通的数字值10转换为一个响应式引用countRef。对countRef.value的修改会影响到原始的值,并且在响应式系统中触发更新。


处理已有ref对象

import { ref, toRef } from 'vue';

const originalRef = ref(20);
const newRef = toRef(originalRef);

如果将一个已有的ref对象传递给toRef(),它会直接返回这个ref对象。


使用getter函数

import { reactive, toRef } from 'vue';

const state = reactive({
  count: 0,
});

const getCount = () => state.count;
const countRef = toRef(state, getCount);

使用getter函数getCount来获取响应式对象state中的count属性的值。toRef()将这个getter函数的返回值包装成一个响应式引用countRef。当state.count的值发生变化时,countRef.value也会相应地更新。

toRefs() 和 toRef() 的区别

  1. 应用场景不同:
    • toRefs()适用于需要将整个响应式对象解构为多个独立响应式引用的情况,通常在函数参数传递或在多个地方使用响应式对象的不同属性时很有用。
    • toRef()适用于只需要创建单个属性的响应式引用的情况,比如在特定场景下只关注一个属性的变化。
  2. 返回值不同:
    • toRefs()返回一个包含多个响应式引用的对象(批量解构)。
    • toRef()返回一个单个的响应式引用(一个一个的操作)。
Vue 3 中的 toRefs:响应式数据的关键函数 Vue 3 中的 toRefs 在处理响应式数据时非常有用,它允许我们在模板或计算属性中访问响应式对象的属性,并保持属性的响应式特性。同时,结合 ref、reactive 和 toRefs 的使用,我们可以更灵活地管理组件的状态和响应式数据。 阅读详情

相关推荐

# Vue3 toRef 和 toRefs 函数

上一篇博文介绍了 vue3 里面的 ref 函数和 reactive 函数,实现响应式数据,今天主要来说一下 toRef 函数和 toRefs 函数的基本使用。通过上一篇博客,我们知道,ref 函数可以创建一个响应式的数据,那 toRef 函数同样也是创建一个响应式的数据,那么他们之间的区别是什么呢?首先一点,ref 函数他的本质其实是去拷贝一份数据,脱离了与源数据的交互。什么意思呢?就是 ref 函数可以将对象里面的属性值变成响应式的数据,修改响应式数据,是不会影响到源数据,但是视图层上的数据会被更新。但

xuhss_com的博客 3209

vue3 toRefs详解

toRefs函数的作用是将响应式对象中的所有属性转换为单独的响应式数据,对象成为普通对象,并且值是关联的。在这个过程中toRefs会做以下两件事:应用场景: 注意:响应式对象的处理,是加给对象的,如果对对象做了展开操作,那么就会丢失响应式的效果。所以上面代码,单击button时,不能改变页面显示效果。 本次单击按钮可以实现修改效果。...

哈 3万+

一文讲清楚vue3中ref、reactive、toRef、toRefs、isRef、isReactive、unref、toValue的使用

先看一个组件我们定义了一个count,还有一个修改它的方法,并尝试在模板中通过两种方式去修改它,但结果却是页面没有任何变化。其实通过这些操作我们已经修改了count的值,只是未能得到视图的更新,所以我们看到的还是最初的值,那如何解决呢?这就引出了响应式数据ref()用于创建一个包装基本类型值的响应式对象。它将基本类型值(如数字、字符串等)转换为响应式对象(但其实也可以是引用类型),使其具有响应式特性。ref()返回一个包含value属性的对象,通过这个属性来访问和修改值。是一个响应式对象,通过ref。

m0_57202548的博客 2311

vue3基础之toRefs方法

【代码】vue3基础之toRefs方法。

weixin_64740434的博客 2297

【Vue3 第六章】ref、toRef、toRefs、toRaw 方法应用

ref、toRef、toRefs、toRaw 方法应用

前端知识分享喵 7096

[后端设计]innovus命令editPin详解?

先放命令,有空慢慢写。

m0_61003348的博客 5731

Vue3 响应式工具函数——isRef()、unref()、toRef()、toValue()、toRefs()、isProxy()、isReactive()、isReadonly()

最近接近年终了,手头上活儿也干的差不多了,没啥事儿就想着看看官方文档,对自己比较模糊的概念进行一下加深,但是当我看到以下几种方法时,单个看着还挺简单,一起看时脑子就会被绕晕,所以写下这篇文章,方便自己也方便大家,随时查阅,如有不好的地方,请大家谅解,并告知我,随时修改。

qq_24625651的博客 996

手把手教你用海康威视相机+DLP4500搭建双目结构光系统(附避坑指南)

本文详细介绍了如何使用海康威视相机和DLP4500搭建双目结构光三维测量系统,涵盖硬件选型、系统搭建、双目标定及三维重建等关键步骤。特别针对预算有限的开发者和实验室团队,提供实用的避坑指南和优化技巧,帮助实现0.02mm的高精度测量。

weixin_42526087的博客 462

Vue 3 组合式API深度剖析:工具函数详解

组合式API除了为我们提供一些核心API,还为我们提供了很多工具函数。核心API详解请移步另一篇博客--->Vue 3组合式API深度剖析:核心API使用指南在Vue 3中,组合式API为我们提供了一种新的方式来组织和管理组件的逻辑。与选项式API不同,组合式API通过导入各种函数来提供响应式数据、生命周期钩子等功能。其中,响应式API工具函数是组合式API中非常重要的一部分,它们帮助我们更灵活地操作响应式数据。本文将详细介绍Vue 3中常用的响应式API工具函数,包括isRef()unref()

aike13ky的博客 2607

BIM模型轻量化避坑指南:Revit导出GLTF常见问题及解决方案

本文深入探讨了BIM模型轻量化过程中,从Revit导出GLTF格式时遇到的常见问题与解决方案。针对文件体积膨胀、材质丢失、属性信息缺失等核心痛点,提供了从数据预处理、Draco几何压缩、纹理优化到Web端性能调优的全流程实战指南,帮助工程师高效实现BIM模型在WebGL环境中的流畅展示与交互。

wdx012345的博客 171

硬件工程师学习-硬件的单元测试(UT)(1)电源与时钟的测试

我们在设计的时候,通过控制电源的上电使能管脚或者通过MOSFET、或者专用的电源上电控制芯片,控制不同电源的上电时序,以确保每个芯片的电源上电时序是满足芯片的要求的。我们在测试的时候,需要对相关的要求一一测试,以确认每个上电时序满足要求的。在维基百科中,相位噪声的定义是“时域不稳定性(抖动)导致波形在相位上发生快速、短期、随机的波动,这种波动在频域中的表现即为相位噪声”。单元测试,一般是指基于开发人员自行开展的功能测试及各个功能单元的单元测试,是硬件信号级的测试,分为基本测试和信号完整性测试。

qq_43416206的博客 4034

你的 Vue 3 toRef()、toRefs(),VuReact 会编译成什么样的 React?

VuReact工具可将Vue 3代码编译为React代码,本文重点解析了Vue中的toRef()和toRefs()在VuReact中的转换结果。toRef()会被编译为useToVRef,实现属性引用转换;toRefs()则转换为useToVRefs,支持安全解构赋值。两者都保持了Vue原版的响应式特性,在React中通过.value访问修改数据。VuReact通过这些适配API实现了Vue到React的无缝转换。

牛爷爷的博客 297

AI自动化时代:一人公司的崛起与商业机会

AI技术正在重塑商业格局,催生"一人公司"创业新模式。这种轻资产、高效率的商业模式通过AI自动化运营,让个人创业者能以极低成本挑战传统企业。核心机会包括:1)AI自主公司替代人力密集型业务;2)为企业提供AI转型解决方案;3)利用AI工具实现个人创业。创业者需快速验证创意,聚焦人机协作,把握当前AI发展窗口期。未来,AI赋能的"一人公司"将成为商业新常态,带来更高的专业化和灵活性。抓住AI红利,学会人机协作,是个人创业成功的关键。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 520

Vue3.0文档整理:3、响应式数据

Vue3.0文档整理:3、响应式数据

Asrty的博客 537

【Altium designer】如何添加过孔阵列

按下图1指示,执行【Tool】菜单栏下【Via Stitching/Shielding】选项卡中的【Add Stitching to Net...】选项 图1 “添加过孔阵列”选项 点击【Add Stitching to Net...】选项后,会跳出一个窗口,让我们设置过孔阵列的参数信息,如下图2所示。 图2 过孔阵列参数设置 过孔阵列区域:勾选该选项框,即可绘制多边形区域; 过孔内径与焊盘直径:比如内径 【Hole Size】设为12mil,焊盘直径【Diameter】设为24mil; .

夜半少年的博客 2万+

OpenHarmony WiFi子系统全解析:从架构到代码实现(大合集)

头文件路径[相对路径][相对路径][相对路径][相对路径]// 网络配置结构 (wifi_device_config.h)// SSID字符串// 预共享密钥// 安全类型// 网络ID// 优先级// 是否隐藏网络// 扫描信息结构 (wifi_scan_info.h)// SSID// BSSID (MAC地址)// 安全类型int rssi;// 信号强度// 频率// 信道宽度// 时间戳// 连接信息结构 (wifi_linked_info.h)

m0_67505153的博客 1059

day11vue3的组合API

vue3的组合API

2301_78238711的博客 139

DeepSeek网页版和DeepSeek Harness

DeepSeek网页版是开箱即用的对话工具,适合快速问答与日常任务;而DeepSeekHarness(dsh)是基于Node.js的开源智能体框架,支持文件操作、命令执行、多工具协同,实现“对话即执行”。二者定位不同:网页版为“大脑”,Harness为“躯体”。前者封闭易用,后者开放可扩展,具备可追溯的执行日志与插件化架构。未来,网页版将聚焦轻量化普及,Harness则致力于构建生态平台。对开发者而言,应将AI作为执行层,守住决策层,深耕垂直领域,并掌握AI工作流设计能力,以构建不可替代的技术优势。

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 893

Vue3学习

vue3的笔记

qq_37062098的博客 815

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Vue3.0学习笔记(持续更新中......)

Vue3.0 Vue3. 0 六大亮点 Preformance:性能比 vue2.x 快 Tree shaking support:按需编译,体积比 vue2.x 小 Composition API:组合 API(类似 React Hooks) Better TypeScript support:更好的 TS 支持 Custom Renderer API:暴露了自定义的 API Fragment,Teleport(Protal),Suspense:更先进的组件 Vue3. 0 是如何变快的? di

weixin_43893477的博客 994

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

vue-course

vue下

weixin_57135131的博客 376

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【vue3】关于ref、toRef、toRefs那些事

vue3项目中关于ref、toRef、toRefs的使用详解

嗨,朋友你好!我是前端领域的工作者 3954

【Vue3】toRefs和toRef在reactive中的一些应用

承接上个标题,我们如果想要将解构的对象变为响应式的,我们应该怎么做呢,只需要import一个toRefs同时我们再将解构的person包裹一下toRefs这样的意思就是,将解构的数据变为Ref定义的响应式对象,将reactive对象变为Ref对象接下来我们改一下方法这样我们再测试一下toRef和toRefs是 Vue3 中用于处理响应式对象的两个函数,它们有一些重要的区别toRef:参数:接收一个响应式对象和一个属性名,返回一个 ref 对象,指向该属性的值。

null18的博客 2504

vue3 toRef函数和toRefs函数

这篇我们看下toRef和toRefs的基本使用 我们知道ref可以用于创建一个响应式数据,而toRef也可以创建一个响应式数据,那他们之间有什么区别呢? 事实上,如果利用ref函数将某个对象中的属性变成响应式数据,修改响应式数据是不会影响到原始数据。 import {ref} from 'vue'; export default { name:'App' setup(){ let obj = {name : 'alice', age : 12}; let newObj= ref(...

wuxing164的博客 3万+

Vue3 toRef 和 toRefs 函数

上一篇博文介绍了 vue3 里面的 ref 函数和 reactive 函数,实现响应式数据,今天主要来说一下 toRef 函数和 toRefs 函数的基本使用。通过上一篇博客,我们知道,ref 函数可以创建一个响应式的数据,那 toRef 函数同样也是创建一个响应式的数据,那么他们之间的区别是什么呢?首先一点,ref 函数他的本质其实是去拷贝一份数据,脱离了与源数据的交互。什么意思呢?就是 ref 函数可以将对象里面的属性值变成响应式的数据,修改响应式数据,是不会影响到源数据,但是视图层上的数据会被更新。但

“跟他人学,和自己比” 4926

vue3中的ref,toRef,toRefs三个的作用

ref、toRef、toRefs都可以将某个对象中的属性变成响应式数据ref的本质是拷贝,修改响应式数据,不会影响到原始数据,视图会更新的本质是引用,修改响应式数据,会影响到原始数据,视图不会更新toRef一次仅能设置一个数据,接收两个参数,第一个参数是哪个对象,第二个参数是对象的哪个属性toRefs接收一个对象作为参数,它会遍历对象身上的所有属性,然后挨个调用toRef执行https。...

q4717529的博客 1万+
上一篇: vue3 响应式 API:ref() 和 reactive()
下一篇: vue3 响应式 API:computed()
fishmemory7sec
博客等级 码龄5年 1165粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值