toref可将reactive对象的属性提取为双向同步的ref,用于传参、解构或watch单字段;需作用于响应式对象,普通对象无效。

直接用 toRef 就能把 reactive 对象里的某个属性“拎出来”,变成一个独立但双向同步的 ref,既保留响应性,又方便传参或解构使用。
什么时候该用 toRef
当你只关心响应式对象中的某一个字段,并希望它能像普通 ref 一样被 watch、传给子组件、或在组合函数中单独暴露时,toRef 就是最佳选择。它不是复制值,而是建立引用链接。
- 把
user.name单独传给子组件,子组件改名也能同步更新父级数据 - 在
setup中解构时避免失去响应性(比如const name = toRef(state, 'name'),而不是const { name } = state) - 配合
watch监听单个字段变化,写法更清晰
基本写法和效果
假设你有这样一个响应式对象:
const user = reactive({ name: 'Alice', age: 28 })
用 toRef 提取 name 字段:
const nameRef = toRef(user, 'name')
这时:
— nameRef.value 和 user.name 始终一致
— 修改 nameRef.value = 'Bob' → user.name 自动变成 'Bob'
— 修改 user.name = 'Charlie' → nameRef.value 也立刻更新
常见搭配场景
传给子组件:
父组件:<child :name="nameRef"></child>
子组件用 defineProps({ name: { type: Object as PropType<ref>> } })</ref> 接收,内部改 props.name.value 会回写到父级。
配合 watch:watch(nameRef, (newVal) => console.log('名字变了:', newVal)) —— 只监听 name,不触发整个对象的 watcher。
设默认值(可选第三参数):const nickname = toRef(user, 'nickname', '匿名用户') —— 如果 user.nickname 不存在,就用这个默认值初始化,且仍保持响应链接。
注意别踩坑
toRef 只对真正的响应式对象有效:
- ✅
reactive({ x: 1 })、readonly(obj)、甚至props(在setup中)都支持 - ❌ 普通对象
{ x: 1 }不行 ——toRef返回的只是普通 ref,改它不会影响原对象 - ⚠️ 不要用在 computed 或其他非响应式源上,否则链接失效
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










