Vue3?中的?readonly?特性及函數(shù)使用詳解
Vue3 中的 readonly 特性詳解
readonly是Vue3中提供的一個新特性,用于將一個響應式對象變成只讀對象。使用readonly可以確保一個對象只能被讀取而不能被修改,從而提高應用的穩(wěn)定性和安全性。
在Vue3中,可以使用readonly函數(shù)將一個對象轉(zhuǎn)換為只讀對象,例如:
import { readonly } from 'vue'
const state = readonly({
count: 0
})在上面的代碼中,state對象被轉(zhuǎn)換為只讀對象,這意味著state.count屬性只能被讀取,而不能被修改。
需要注意的是,readonly函數(shù)是遞歸的,也就是說,如果一個對象包含其他對象,那么這些對象也會被轉(zhuǎn)換為只讀對象。例如:
import { readonly } from 'vue'
const state = readonly({
user: {
name: 'John',
age: 30
}
})在上面的代碼中,user對象也被轉(zhuǎn)換為只讀對象,這意味著state.user.name和state.user.age屬性都只能被讀取,而不能被修改。
需要注意的是,readonly函數(shù)只能將一個對象轉(zhuǎn)換為只讀對象,而不能將一個數(shù)組或Map等其他類型的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為只讀對象。如果需要將這些數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為只讀對象,可以使用readonly函數(shù)和deepReadonly函數(shù)的組合。例如:
import { readonly, deepReadonly } from 'vue'
const state = readonly({
items: deepReadonly([
{ id: 1, name: 'item 1' },
{ id: 2, name: 'item 2' },
{ id: 3, name: 'item 3' }
])
})在上面的代碼中,items數(shù)組被轉(zhuǎn)換為只讀數(shù)組,其中的對象也被轉(zhuǎn)換為只讀對象,這意味著數(shù)組和對象都只能被讀取,而不能被修改。
補充:vue3中的readonly單向數(shù)據(jù)流函數(shù)(readonly函數(shù)使用詳解)
vue3中的readonly單向數(shù)據(jù)流函數(shù),傳入一個對象(響應式或普通)或 ref,返回一個原始對象的只讀代理。一個只讀的代理是“深層的”,對象內(nèi)部任何嵌套的屬性也都是只讀的。
一、注意:
1、readonly函數(shù)是將通過ref 或reactive定義好的數(shù)據(jù)進行拷貝后變?yōu)閮H可讀的數(shù)據(jù),不可進行修改,即無響應
2、如強制修改 控制臺將會報錯警告
二、reactive 和 readonly
<template>
<div>
<img alt="Vue logo" src="./assets/logo.png" />
<h1>vue3.0 beta</h1>
<h1>{{ original.count }} ----- {{ copy.count }}</h1>
<button @click="add">add</button>
</div>
</template>
<script>
import { reactive, readonly, watchEffect } from "vue";
export default {
setup() {
const original = reactive({ count: 0 });
const copy = readonly(original);
watchEffect(() => {
// 依賴追蹤
console.log(copy.count);
});
// original 上的修改會觸發(fā) copy 上的偵聽
original.count++;
// 無法修改 copy 并會被警告
copy.count++; // warning!
return {
original,
copy
};
}
};
</script>可以看到觸發(fā)了只2次 "watchEffect" 函數(shù),因為 copy 是只讀的。

三、ref 和 readonly
<template>
<div>
<img alt="Vue logo" src="./assets/logo.png" />
<h1>vue3.0 beta</h1>
<h1>{{ refData }} ----- {{ copy }}</h1>
</div>
</template>
<script>
import { ref, readonly } from "vue";
export default {
setup() {
const refData = ref(0);
const copy = readonly(refData);
// 無法修改 copy 并會被警告
copy.value++; // warning!
return {
refData,
copy
};
}
};
</script>可以看到控制臺提示如下:
"Set operation on key "value" failed: target is readonly"

四、Object普通對象 和 readonly
<template>
<div>
<img alt="Vue logo" src="./assets/logo.png" />
<h1>vue3.0 beta</h1>
<h1>{{ original.count }} ----- {{ copy.count }}</h1>
<button @click="add">add</button>
</div>
</template>
<script>
import { readonly, watchEffect } from "vue";
export default {
setup() {
const original = { count: 0 };
const copy = readonly(original);
watchEffect(() => {
// 依賴追蹤
console.log(copy.count);
});
// original 上的修改會觸發(fā) copy 上的偵聽
original.count++;
// 無法修改 copy 并會被警告
copy.count++; // warning!
const add = () => {
copy.count++;
};
return {
original,
copy,
add
};
}
};
</script>可以看到我們一直點擊按鈕在++操作,控制臺會提示錯誤,然后界面也沒更新,因為你的數(shù)據(jù)源不是響應式的。

到此這篇關(guān)于Vue3 中的 readonly 特性詳解的文章就介紹到這了,更多相關(guān)Vue3 readonly內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vite+vue3不清除瀏覽器緩存直接下載最新代碼的解決方案
vite+vue3項目發(fā)布后,瀏覽器上還是舊代碼,沒有及時更新到最新代碼,下面通過本文給大家分享vite+vue3不清除瀏覽器緩存直接下載最新代碼的解決方案,感興趣的朋友一起看看吧2024-06-06
基于vue監(jiān)聽滾動事件實現(xiàn)錨點鏈接平滑滾動的方法
Vue Element-UI中el-table實現(xiàn)單選的示例代碼
Vue.js條件渲染和列表渲染以及Vue中key值的內(nèi)部原理
vue+el-table點擊表頭實現(xiàn)改變其當前樣式

