> 技术文档 > vue3中的ref、reative、toRef、toRefs

vue3中的ref、reative、toRef、toRefs


ref

是什么

生成值类型的响应式数据
可用于模板和reactive
通过.value修改值

为什么要.value

值类型没有引用关系 为了不丢失响应式 所以采用对象 并用value存值
并通过value属性的get和set实现响应式
类似computed的定义
vue3中的ref、reative、toRef、toRefs

小tips

命名尽量后面跟一个Ref 这样更清晰
vue3中的ref、reative、toRef、toRefs

还可以用来获取dom

vue3中的ref、reative、toRef、toRefs

reative

与ref的区别

vue3中的ref、reative、toRef、toRefs

toRef

概念

将一个响应式对象的某个属性变为ref 并具有响应式
当然 这种响应式是双向的
vue3中的ref、reative、toRef、toRefs

应用场景

解构属性时保持响应式(避免丢失响应性)​

import { reactive, toRef } from \'vue\';const state = reactive({ age: 20, name: \"张三\" });// ❌ 普通解构:直接取值,失去响应性!const { age } = state; // 此时 `age` 只是普通数字 20,修改它不会更新原对象或视图。// ✅ 使用 toRef:保持响应式连接const ageRef = toRef(state, \'age\'); // 修改 ageRef.value 会同步更新 state.age 和视图

在组合函数(Composable)中传递单个属性​
假设你需要编写一个复用逻辑,只关心响应式对象的某个属性:

// 组合函数:监听年龄变化function useAgeWatcher(ageRef) { // 要求传入 Ref 类型 watch(ageRef, (newAge) => { console.log(\"年龄变化:\", newAge); });}// 父组件setup() { const state = reactive({ age: 20, name: \"李四\" }); // ✅ 使用 toRef 传入可响应属性 useAgeWatcher(toRef(state, \'age\')); }

跨组件传递属性时保持响应式​

<!-- 父组件 --><template> <Child :ageRef=\"ageRef\" /></template><script setup>import { reactive, toRef } from \'vue\';const state = reactive({ age: 20 });const ageRef = toRef(state, \'age\');</script><!-- 子组件 Child.vue --><template> <button @click=\"ageRef.value++\">年龄+1</button></template><script setup>defineProps([\'ageRef\']); // 子组件修改 ageRef.value 会更新父组件的 state.age</script>

toRefs

概念

toRefs 接收一个响应式对象(由 reactive() 创建),返回一个新的​​普通对象​​。该对象的每个属性都是指向原对象对应属性的 ref 引用,而非原始值。这些 ref 会与源属性保持双向同步:修改 ref 会更新原对象,反之亦然

应用场景

组合式函数(Composable)的返回值
在自定义逻辑函数中返回 toRefs(state),允许调用方解构使用属性而不破坏响应性

function useCounter() { const state = reactive({ count: 0 }); return { ...toRefs(state) }; // 解构后仍响应}const { count } = useCounter();

跨组件传递响应式属性

将 toRefs 解构的 ref 作为 props 传递给子组件,确保子组件接收的仍是响应式数据