toref() 函数和toRefs() 函数

toRef和toRefs是Vue.js中的函数,用于处理响应式对象的属性。toRef用于创建一个对源响应式对象属性的引用,保持响应式连接,而在模板和JS中需要通过.value获取值。toRefs则将整个响应式对象转换为普通对象,但每个属性都是响应式的ref,适合解构赋值。两者改变数据值都会影响原始数据,且都不会自动触发UI更新。

toref() 函数:
● toRef 用于为源响应式对象上的属性新建一个ref,从而保持对其源对象属性的响应式连接。接收两个参数:源响应式对象和属性名,返回一个ref数据。例如使用父组件传递的props数据时,要引用props的某个属性且要保持响应式连接时就很有用。
在这里插入图片描述

● Template中直接获取值,js中需要加.value获取数据值
● toRef后的ref数据不是原始数据的拷贝,而是引用,改变结果数据的值也会同时改变原始数据
● 不会触发UI界面的更新

toRefs() 函数

● toRefs 用于将响应式对象转换为普通对象,但是其中的每个属性都会指向原始对象相应属性的ref(也就是依然保持响应式)。常用于es6的解构赋值操作,因为在对一个响应式对象直接解构时解构后的数据将不再有响应式,而使用toRefs可以方便解决这一问题。
在这里插入图片描述


● 获取数据值的时候需要加.value
● toRefs后的ref数据不是原始数据的拷贝,而是引用,改变结果数据的值也会同时改变原始数据
● 作用其实和 toRef 类似,只不过 toRef 是一个个手动赋值,而 toRefs 是自动赋值

`ref`、`toRef` `toRefs` 都是 Vue 3 中用于处理响应式数据的工具,它们之间有以下区别: ### 功能用途 - **ref**:用于创建一个值类型的响应式数据,可用于模板,并且可以通过 `.value` 修改值。它既可以用来包装基本数据类型(如数字、字符串等),也能包装对象或数组,将其转换为响应式数据。例如: ```vue <template> <div>{{ count.value }}</div> <button @click="increment">Increment</button> </template> <script setup> import { ref } from &#39;vue&#39;; const count = ref(0); const increment = () => { count.value++; }; </script> ``` - **toRef**:针对一个响应式对象(`reactive` 创建的)的某个属性创建一个 `ref`,两者保持引用关系。当需要单独处理某个响应式属性时使用,例如要将响应式对象中的某个属性单独提供给外部使用时。示例代码如下: ```vue <template> <div>{{ name.value }}</div> <button @click="changeName">Change Name</button> </template> <script setup> import { reactive, toRef } from &#39;vue&#39;; const person = reactive({ name: &#39;John&#39; }); const name = toRef(person, &#39;name&#39;); const changeName = () => { name.value = &#39;Jane&#39;; }; </script> ``` - **toRefs**:将一个响应式对象(`reactive` 封装的)转换为普通对象,对象的每个属性都是对应的 `ref`,同样与原始响应式对象保持引用关系。适用于需要将整个响应式对象的属性都转换为 `ref` 的场景,通常用于将响应式对象的属性传递给其他组件或函数时。示例代码如下: ```vue <template> <div>{{ personRefs.name.value }}</div> <button @click="changeName">Change Name</button> </template> <script setup> import { reactive, toRefs } from &#39;vue&#39;; const person = reactive({ name: &#39;John&#39; }); const personRefs = toRefs(person); const changeName = () => { personRefs.name.value = &#39;Jane&#39;; }; </script> ``` ### 创建对象的目标 - **ref**:可以基于基本数据类型或对象直接创建响应式引用。 - **toRef toRefs**:必须针对一个响应式对象(`reactive` 创建的),普通对象无法通过它们变成响应式的,其设计初衷就是针对响应式对象进行操作 [^4]。 ### 创建数量 - **ref**:一次只能创建一个响应式引用。 - **toRef**:一次只能为响应式对象的一个属性创建 `ref`。 - **toRefs**:可以批量为响应式对象的所有属性创建 `ref` [^3]。 ### 同步性及注意事项 - **ref**:是一个独立的响应式引用,其值的修改不依赖于其他对象。 - **toRef toRefs**:创建的 `ref` 都与原始响应式对象保持同步,修改 `ref` 的值会影响原始对象,反之亦然。不过在使用 `toRefs` 时,如果原始响应式对象的属性发生变化(如添加新属性),`toRefs` 返回的对象不会自动更新,需要重新调用 `toRefs` 来获取最新的 `ref` 属性 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲码的老余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值