必须用 toRefs 是因为 reactive 返回 Proxy 对象,解构会丢失响应性;toRefs 将每个属性转为 ref,保持响应式访问通道,解构后需通过 .value 修改才能触发更新。

直接解构 reactive 对象会丢失响应性,因为解构出的是普通值(如数字、字符串),不再是代理对象的响应式访问通道。要让解构后的变量仍能驱动视图更新,必须用 toRefs 包装原始响应式对象。
为什么必须用 toRefs?
reactive 返回的是一个 Proxy 代理对象,它的响应能力依赖于对 state.xxx 这种属性访问路径的拦截。而解构语句:
实际执行的是“取值快照”——把 state.count 当前的值(比如 0)复制给新变量 count,这个 count 就是普通 JS 变量,后续修改它不会触发 setter,也就不会通知视图更新。
根据项目规范生成 React 和 Vue 组件,包括 TypeScript 类型定义、Ant Design 5 集成、Tailwind CSS 样式及 Vitest 测试文件。当用户提出创建、生成或搭建前端组件的需求时启用,例如:“帮我写一个表格组件”、“生成一个弹窗”、“create a form component”、“写一个列表页”、“生成一个下拉选择器”。该能力在以下任一场景触发:涉及 React/TSX/Vue 组件生成、UI 组件创建,或为组件生成测试文件。
正确使用 toRefs 的三步法
- 先用
reactive创建响应式对象 - 立即用
toRefs包裹它,得到一个各属性都是ref的对象 - 再解构,此时每个变量都是带
.value的响应式引用
示例:
const state = reactive({ count: 0, name: 'Vue' })const { count, name } = toRefs(state)
// ✅ count 和 name 都是 ref
count.value++ // 视图立刻更新
常见误用提醒
-
toRefs只接受reactive返回的对象,不能传ref或普通对象 - 不要在解构后漏掉
.value:写count++是错的,必须写count.value++ - 如果只用一两个字段,也可以用
toRef(state, 'count')替代,更轻量
搭配 setup 和组合式函数更实用
在封装逻辑函数时,若把解构后的变量传进去,下游就断连了。改用 toRefs 后传参,接收方拿到的是标准 ref,可直接读写 .value 或用 unref 统一处理:
useCounter(count) // 自定义 Hook 内部可响应变化
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









