toRefs 的作用是将 reactive 对象的每个属性转为 ref,保持响应性链接,避免解构导致的响应式丢失;其本质是创建响应式属性的引用而非值拷贝。

在 Vue 3 中,用 toRefs 并不是为了解决“结构响应式丢失”本身,而是为了安全地解构响应式对象(比如 reactive 返回的对象),避免破坏响应性。真正丢失响应式的根源,是直接解构导致的“引用断裂”——解构出的变量脱离了原始响应式代理的追踪体系。
为什么解构 reactive 对象会丢失响应式?
Vue 的响应式系统依赖于对代理对象(Proxy)属性的访问拦截。reactive 返回的是一个代理对象,它的所有属性访问都会被追踪。但一旦你这样写:
const state = reactive({ count: 0, name: 'Alice' });<br>const { count, name } = state; // ❌ 解构后,count 和 name 是普通值,不再响应
此时 count 和 name 是从代理中“取出来”的原始值(即 state.count 的当前快照),它们和 state 再无关联。后续修改 count++ 不会触发视图更新,因为 Vue 根本没监听这个独立变量。
立即学习“前端免费学习笔记(深入)”;
toRefs 的作用:把每个属性转成 ref,保留响应链接
toRefs 接收一个响应式对象,返回一个由 ref 组成的对象,每个 ref 都精确指向原响应式对象的对应属性。这样解构出来的变量仍是响应式的:
使用 `@ainative/vue-sdk` 为 Vue 3 应用添加 AI 聊天功能。适用于以下场景:(1) 安装 `@ainative/vue-sdk`,(2) 在 Vue 组件中使用 `useChat` 组合式函数,(3) 提供……
const state = reactive({ count: 0, name: 'Alice' });<br>const { count, name } = toRefs(state); // ✅ 每个都是 ref,可读 .value,且保持响应
-
count是一个ref,读取需count.value,赋值也用count.value = 5 - 模板中使用时,Vue 会自动解包
ref,所以{{ count }}仍能正常显示并响应变化 - 它本质上创建了“响应式属性的引用”,而非拷贝值
什么时候必须用 toRefs?
主要出现在以下场景:
- 从
setup()或组合式函数中返回reactive对象,并希望用户方便解构使用 - 封装自定义 Hook(如
useUser()),内部用reactive管理状态,对外暴露解构友好的接口 - 需要把响应式对象的多个字段分别传给子组件 props 或其他函数,又不想传整个对象
反例:如果只返回单个 ref(比如用 ref() 创建的状态),解构完全安全,无需 toRefs;如果根本不用解构,直接用 state.count,也不需要。
更简洁的写法:配合 toRef 或解构后显式转 ref
如果你只关心某几个字段,不必全量转换:
const state = reactive({ count: 0, name: 'Alice', loading: false });<br>const count = toRef(state, 'count'); // 只转 count<br>const { name } = toRefs(state); // 只解构 name(已转为 ref)
或者,在模板中混合使用:{{ count }}(ref 自动解包)、{{ state.loading }}(直接访问响应式对象属性),也是常见且合理的做法。

















