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

toRefs 和 toRef 的区别和用法

1. toRefs - 批量解构响应式对象

作用:

将响应式对象的所有属性转换为独立的 ref,保持响应性

你的代码示例:

let person = reactive({name:'张三',age:18
})// 使用toRefs解构,name和age依然是响应式的
let {name,age} = toRefs(person)

特点:

  • 批量转换: 一次性转换对象的所有属性
  • 保持响应性: 解构后的变量仍然是响应式的
  • 双向绑定: 修改 name.value 会同步更新 person.name

使用场景:

// 在模板中可以直接使用
<h2>姓名:{{name}}</h2>  // 不需要 person.name
<h2>年龄:{{age}}</h2>   // 不需要 person.age// 在方法中
function changeName(){name.value += '~'  // 直接修改,会同步到person.name
}

2. toRef - 单个属性转换

作用:

将响应式对象的单个属性转换为 ref

你的代码示例:

let nl = toRef(person,'age')  // 只转换age属性
console.log(nl.value)  // 18

特点:

  • 单个转换: 只转换指定的一个属性
  • 保持响应性: 转换后的变量仍然是响应式的
  • 精确控制: 可以选择性地转换需要的属性

3. 对比总结

特性toRefstoRef
转换范围整个对象的所有属性单个指定属性
返回值包含所有属性的对象单个ref
使用场景需要解构整个对象只需要某个属性
语法let {name,age} = toRefs(obj)let age = toRef(obj,'age')

4. 实际应用示例

使用 toRefs 的场景:

// 表单数据
const formData = reactive({username: '',email: '',password: ''
})// 解构后可以直接使用
const { username, email, password } = toRefs(formData)// 在模板中
<input v-model="username" />
<input v-model="email" />

使用 toRef 的场景:

// 只需要某个特定属性
const user = reactive({name: 'John',age: 25,address: 'Beijing',phone: '123456'
})// 只关心年龄
const userAge = toRef(user, 'age')
console.log(userAge.value) // 25

5. 注意事项

为什么需要这些工具?

// ❌ 直接解构会失去响应性
const { name, age } = person  // 失去响应性// ✅ 使用toRefs保持响应性
const { name, age } = toRefs(person)  // 保持响应性

在你的代码中:

// 这样解构后,name和age仍然是响应式的
let {name,age} = toRefs(person)// 修改name会同步更新person.name
function changeName(){name.value += '~'console.log(name.value,person.name)  // 两者值相同
}

这两个工具解决了Vue 3中响应式对象解构后失去响应性的问题,让你可以安全地解构响应式对象而不丢失响应性!

http://www.dtcms.com/a/349972.html

相关文章:

  • 计算机实习经历包装/编写
  • 使用阿里云实现短信注册
  • 通过URI Scheme实现从Web网页上打开本地C++应用程序(以腾讯会议为例,附完整实现源码)
  • 从 “能对话” 到 “会思考”:通用人工智能离我们还有多远?
  • 【LeetCode 热题 100】416. 分割等和子集——(解法一)记忆化搜索
  • 函数指针与回调函数(c++)
  • 厚铜pcb的工艺流程与制造工艺
  • AI创业公司:Freya 金融语音AI Agent
  • 猴车安全新保障:AI摄像机智能监测人员乘坐合规性
  • 算法 --- 双指针
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(19):文法复习+单词第7回1
  • 【C++高并发内存池篇】ThreadCache 极速引擎:C++ 高并发内存池的纳秒级无锁革命!
  • 【51单片机固定按键占空比】2022-11-12
  • 曲面法向量的数学推导与 SymPy 实现
  • 基于MATLAB长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析;长时序NDVI/LAI/GPP产品预处理
  • 音视频学习(五十七):RTSP信令交互流程
  • 1424. 对角线遍历 II
  • “Datawhale AI夏令营--coze空间
  • Java多线程常见误区与最佳实践总结
  • Spring拦截器中@Resource注入为null的问题
  • Github热门开源项目榜单 - 2025年07月
  • 【c++】leetcode300 最长递增子序列
  • 二、添加3D形状
  • Springboot应用如何与SkyWalking集成,并使用Docker进行发布
  • 深入理解Linux进程程序替换:从原理到实践
  • Elasticsearch JVM调优:核心参数与关键技巧
  • Git克隆时遇到“Filename too long“错误的完美解决方案
  • 代理设计模式
  • 俄罗斯情报机构推出新型安卓恶意软件,伪装成杀毒软件
  • SciPy科学计算与应用:SciPy入门与应用-科学计算与NumPy协同实践