isReactive 仅对 reactive() 创建的深度响应式对象返回 true,对 ref、shallowReactive、readonly、普通对象及原始值均返回 false,它检测内部 __v_isReactive 标记而非运行时响应性。

isReactive 是 Vue 3 Composition API 提供的工具函数,用于**同步判断一个值是否为通过 reactive() 创建的响应式对象**(不包括 ref、computed 等其他响应式类型)。
它只对 reactive 创建的对象返回 true
只有使用 reactive({}) 创建的普通对象才被 isReactive() 识别为 true。其他情况均返回 false:
-
ref()包裹的值:即使内部是对象,isReactive(refObj)返回false(需用isRef()判断) -
shallowReactive()创建的对象:返回false(它不是深度响应式,isReactive不认) -
readonly()或shallowReadonly()包裹的 reactive 对象:返回false(响应式标识被移除) - 普通对象、数组、null、undefined、原始值:一律返回
false
基本用法示例
在 setup 或组合式函数中直接调用:
来自 Vercel Engineering 的 React 和 Next.js 性能优化指南。用于编写、审查或重构 React/Next.js 代码以确保最佳性
import { reactive, isReactive } from 'vue'
const state = reactive({ count: 0 })
const normalObj = { name: 'Alice' }
console.log(isReactive(state)) // true
console.log(isReactive(normalObj)) // false
```
注意:不能靠它判断“有没有响应性”,而要看“怎么创建的”
isReactive 检查的是对象内部是否带有 reactive 的响应式代理标记(即 __v_isReactive),不是运行时行为检测。因此:
- 它不会触发依赖收集,也不影响响应式系统
- 对从 reactive 对象解构出来的属性(如
const { count } = state)调用isReactive(count)得到false(因为count是原始 number) - 想统一判断某值是否“具有响应能力”,需结合
isRef、isReactive、isReadonly等一起用
常见误用场景提醒
以下写法容易出错,需特别注意:
- ❌
isReactive(toRef(state, 'count'))→ 返回false(toRef 返回的是 ref,不是 reactive 对象) - ❌
isReactive(readonly(state))→ 返回false(readonly 剥离了 reactive 标识) - ❌ 在模板中直接写
{{ isReactive(obj) }}→ 报错(工具函数不能在模板中调用,须在 script 中判断后传入)










