# 1.readonly 一般用于给子组件传递数据怕被随意修改时
接受一个对象 (响应式或纯对象) 或 ref 并返回原始对象的只读代理。只读代理是深层的:任何被访问的嵌套 property 也是只读的。— 官方原话
App 为根组件 下面 Home 例子都被此组件引用
// App.vue | |
<template> | |
<div> | |
<home></home> | |
</div> | |
</template> | |
<script> | |
import Home from "./Home.vue"; | |
export default { | |
components: { | |
Home, | |
}, | |
}; | |
</script> | |
<style scoped> | |
</style> |
# 2.readonly 普通对象
// Home.vue | |
<template> | |
<div> | |
<button @click="updateState">修改name为Nico</button> | |
</div> | |
</template> | |
<script> | |
import { readonly } from "vue"; | |
export default { | |
setup() { | |
const info1 = { name: "Neko" }; // 普通对象 | |
console.log("原值:", info1); | |
const readonlyInfo1 = readonly(info1); | |
const updateState = () => { | |
readonlyInfo1.name = "Nico"; // 修改值看是否会发生变化 | |
console.log("info1", info1); //info1 没有成功改变 | |
console.log("readonlyInfo1", readonlyInfo1); //readonlyInfo1 也没有成功改变 | |
}; | |
return { | |
updateState, | |
}; | |
}, | |
}; | |
</script> | |
<style scoped></style> |
参考结果:
# 3.readonly 对 reactive 是否有用
// Home.vue | |
<template> | |
<div> | |
<button @click="updateState">修改name为Nico</button> | |
</div> | |
</template> | |
<script> | |
import { reactive, readonly } from "vue"; | |
export default { | |
setup() { | |
// 响应式的对象 readonly 对 reactive 是否起作用 | |
const info2 = reactive({ | |
name: "Neko", | |
}); | |
console.log("原值:", info2); | |
const readonlyInfo2 = readonly(info2); | |
const updateState = () => { | |
readonlyInfo2.name = "Nico"; | |
console.log("info2", info2); //info2 的 nane 值没有被修改 | |
console.log("readonlyInfo2", readonlyInfo2); //readonlyInfo2 的 name 值也没有被修改 | |
}; | |
return { | |
updateState, | |
}; | |
}, | |
}; | |
</script> | |
<style scoped> | |
</style> |
参考结果:
# 4.readonly 对 ref 是否有用
// Home.vue | |
<template> | |
<div> | |
<button @click="updateState">修改name为Nico</button> | |
</div> | |
</template> | |
<script> | |
import { ref, readonly } from "vue"; | |
export default { | |
setup() { | |
// 响应式的对象 readonly 对 reactive 是否起作用 | |
const info3 = ref("Neko"); | |
console.log("原值:", info3); | |
const readonlyInfo3 = readonly(info3); | |
const updateState = () => { | |
readonlyInfo3.value = "Nico"; //ref 是通过 value 来修改的 | |
console.log("info2", info3); //info3 的 nane 值没有被修改 | |
console.log("readonlyInfo3", readonlyInfo3); //readonlyInfo3 的 name 值也没有被修改 | |
}; | |
return { | |
updateState, | |
}; | |
}, | |
}; | |
</script> | |
<style scoped> | |
</style> |
参考结果: