isreadonly 是 vue 3 用于检测响应式只读代理的工具函数,仅对 readonly 或 readonly(ref()) 创建的代理返回 true,对普通对象、reactive、ref 及 object.freeze() 对象均返回 false。

isReadonly 是 Vue 3 响应式系统提供的一个工具函数,用于判断一个响应式代理(如 readonly 或 ref 包裹的对象)是否为只读代理。它**只对 Vue 创建的只读代理返回 true**,对普通对象、reactive 代理、原始值等均返回 false。
确认 isReadonly 的使用前提
该函数来自 vue 包,需先导入:
import { isReadonly, readonly, reactive, ref } from 'vue'
注意:isReadonly **不能检测非 Vue 创建的只读对象**(比如用 Object.freeze() 或 const 声明的普通对象),它只识别 Vue 内部标记的只读代理。
常见判断场景与写法
- 判断
readonly()包裹的对象:返回true - 判断
reactive()创建的对象:返回false - 判断
ref():默认为可写,返回false;但readonly(ref())返回true - 判断嵌套结构中的子属性(如
obj.foo):仍可正确识别其是否为只读代理(前提是该子属性本身是 Vue 创建的只读代理)
实际代码示例
const normal = { count: 1 }
const ro = readonly({ count: 1 })
const reac = reactive({ count: 1 })
const r = ref(1)
const roRef = readonly(ref(1))
console.log(isReadonly(normal)) // false
console.log(isReadonly(ro)) // true
console.log(isReadonly(reac)) // false
console.log(isReadonly(r)) // false
console.log(isReadonly(roRef)) // true
注意事项
- 对
shallowReadonly创建的代理也返回true - 对解构后的属性(如
const { foo } = ro)调用isReadonly(foo):若foo本身不是 Vue 代理(例如是原始值或普通对象),结果为false;只有当foo是另一个readonly代理时才为true - 不建议用它做运行时权限控制,仅用于调试或条件逻辑(如渲染前跳过某些编辑操作)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










