ref专为基本类型设计,通过对象包装实现响应式;reactive仅支持引用类型,直接proxy代理。两者不可互换,混合使用需注意解构与访问方式差异。

基本类型和引用类型在 JavaScript 中的 API 使用差异,核心在于“能否被代理”和“是否需要包装”。Vue3 的 ref 和 reactive 就是这种差异最直接的体现——它们不是随意设计的,而是严格对应 JS 类型底层行为。
ref 专为基本类型而生
基本类型(如 number、string、boolean)无法被 Proxy 直接代理,因为它们没有属性可拦截,赋值就是值替换。ref 用一个对象包裹它,提供 .value 属性,把基本类型“变成可监听的对象结构”:
- let count = ref(0) → 实际是 { value: 0 },响应式靠读写 .value 触发依赖收集与更新
- 模板中使用时可直接写 {{ count }}(Vue 自动解包),但逻辑里必须用 count.value
- 也可包裹引用类型,但不推荐——reactive 更自然、性能略优
reactive 只认引用类型
reactive 底层用 Proxy 拦截对象/数组的 get/set/deleteProperty 等操作,因此只能作用于 Object、Array、Map、Set 等引用类型:
- const state = reactive({ name: 'Alice', list: [1, 2] }) → 所有嵌套属性默认响应式
- 不能写 reactive('hello') 或 reactive(42),会静默退化为普通值,不触发更新
- 深层嵌套对象、数组增删改都自动响应,但注意:直接替换整个属性(state.obj = {})仍有效,因为 reactive 代理的是整个对象本身
混合场景:ref 包裹对象 vs reactive
当需要把一个对象作为响应式变量,又想保持统一访问方式(比如函数参数或组合式 API 返回值),ref 是更灵活的选择:
- ref({}) 和 reactive({}) 都能实现响应式,但 ref 对象需通过 .value 访问,reactive 则直接访问属性
- ref 支持解构后仍保持响应式(配合 toRefs),reactive 解构后会丢失响应性
- 函数返回响应式数据时,常用 ref 包裹对象,避免用户误用解构破坏响应性
类型判断与运行时检查
实际开发中可通过 isRef / isReactive / isProxy 辅助判断:
- isRef(val) → 判断是否为 ref(无论包装基本还是引用类型)
- isReactive(val) → 判断是否由 reactive 创建(只对引用类型有效)
- isProxy(val) → 判断是否被 Proxy 包裹(ref 的 .value 不是 Proxy,reactive 对象是)
- 注意:null、undefined、原始值永远不是 reactive,也不是 ref(除非显式用 ref() 包裹)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











