Vue3?中的?readonly?特性及函數(shù)使用詳解
Vue3 中的 readonly 特性詳解
readonly
是Vue3中提供的一個(gè)新特性,用于將一個(gè)響應(yīng)式對(duì)象變成只讀對(duì)象。使用readonly
可以確保一個(gè)對(duì)象只能被讀取而不能被修改,從而提高應(yīng)用的穩(wěn)定性和安全性。
在Vue3中,可以使用readonly
函數(shù)將一個(gè)對(duì)象轉(zhuǎn)換為只讀對(duì)象,例如:
import { readonly } from 'vue' const state = readonly({ count: 0 })
在上面的代碼中,state
對(duì)象被轉(zhuǎn)換為只讀對(duì)象,這意味著state.count
屬性只能被讀取,而不能被修改。
需要注意的是,readonly
函數(shù)是遞歸的,也就是說(shuō),如果一個(gè)對(duì)象包含其他對(duì)象,那么這些對(duì)象也會(huì)被轉(zhuǎn)換為只讀對(duì)象。例如:
import { readonly } from 'vue' const state = readonly({ user: { name: 'John', age: 30 } })
在上面的代碼中,user
對(duì)象也被轉(zhuǎn)換為只讀對(duì)象,這意味著state.user.name
和state.user.age
屬性都只能被讀取,而不能被修改。
需要注意的是,readonly
函數(shù)只能將一個(gè)對(duì)象轉(zhuǎn)換為只讀對(duì)象,而不能將一個(gè)數(shù)組或Map等其他類(lèi)型的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為只讀對(duì)象。如果需要將這些數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為只讀對(duì)象,可以使用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ù)組,其中的對(duì)象也被轉(zhuǎn)換為只讀對(duì)象,這意味著數(shù)組和對(duì)象都只能被讀取,而不能被修改。
補(bǔ)充:vue3中的readonly單向數(shù)據(jù)流函數(shù)(readonly函數(shù)使用詳解)
vue3中的readonly單向數(shù)據(jù)流函數(shù),傳入一個(gè)對(duì)象(響應(yīng)式或普通)或 ref,返回一個(gè)原始對(duì)象的只讀代理。一個(gè)只讀的代理是“深層的”,對(duì)象內(nèi)部任何嵌套的屬性也都是只讀的。
一、注意:
1、readonly函數(shù)是將通過(guò)ref 或reactive定義好的數(shù)據(jù)進(jìn)行拷貝后變?yōu)閮H可讀的數(shù)據(jù),不可進(jìn)行修改,即無(wú)響應(yīng)
2、如強(qiáng)制修改 控制臺(tái)將會(huì)報(bào)錯(cuò)警告
二、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(() => { // 依賴(lài)追蹤 console.log(copy.count); }); // original 上的修改會(huì)觸發(fā) copy 上的偵聽(tīng) original.count++; // 無(wú)法修改 copy 并會(huì)被警告 copy.count++; // warning! return { original, copy }; } }; </script>
可以看到觸發(fā)了只2次 "watchEffect" 函數(shù),因?yàn)?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); // 無(wú)法修改 copy 并會(huì)被警告 copy.value++; // warning! return { refData, copy }; } }; </script>
可以看到控制臺(tái)提示如下:
"Set operation on key "value" failed: target is readonly"
四、Object普通對(duì)象 和 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(() => { // 依賴(lài)追蹤 console.log(copy.count); }); // original 上的修改會(huì)觸發(fā) copy 上的偵聽(tīng) original.count++; // 無(wú)法修改 copy 并會(huì)被警告 copy.count++; // warning! const add = () => { copy.count++; }; return { original, copy, add }; } }; </script>
可以看到我們一直點(diǎn)擊按鈕在++操作,控制臺(tái)會(huì)提示錯(cuò)誤,然后界面也沒(méi)更新,因?yàn)槟愕臄?shù)據(jù)源不是響應(yīng)式的。
到此這篇關(guān)于Vue3 中的 readonly 特性詳解的文章就介紹到這了,更多相關(guān)Vue3 readonly內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
五步教你用Nginx部署Vue項(xiàng)目及解決動(dòng)態(tài)路由刷新404問(wèn)題
nginx 是一個(gè)代理的服務(wù)器,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)五步教你用Nginx部署Vue項(xiàng)目及解決動(dòng)態(tài)路由刷新404問(wèn)題的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12el-form-item中表單項(xiàng)label和表單項(xiàng)內(nèi)容換行實(shí)現(xiàn)方法
這篇文章主要給大家介紹了el-form-item中表單項(xiàng)label和表單項(xiàng)內(nèi)容換行實(shí)現(xiàn)的相關(guān)資料,每個(gè)表單el-form由多個(gè)表單域el-form-item組成,需要的朋友可以參考下2023-09-09Vue.js手風(fēng)琴菜單組件開(kāi)發(fā)實(shí)例
這篇文章主要為大家詳細(xì)介紹了Vue.js手風(fēng)琴菜單組件開(kāi)發(fā)實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Vue3使用 createApp 自定義通用Dialog的方法
這篇文章主要介紹了Vue3使用 createApp 自定義通用Dialog的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01Vue開(kāi)發(fā)之watch監(jiān)聽(tīng)數(shù)組、對(duì)象、變量操作分析
這篇文章主要介紹了Vue開(kāi)發(fā)之watch監(jiān)聽(tīng)數(shù)組、對(duì)象、變量操作,結(jié)合實(shí)例形式分析了vue.js使用Watch針對(duì)數(shù)組、對(duì)象、變量監(jiān)聽(tīng)相關(guān)操作技巧,需要的朋友可以參考下2019-04-04Element?Plus在el-form-item中設(shè)置justify-content無(wú)效的解決方案
這篇文章主要介紹了Element?Plus在el-form-item中設(shè)置justify-content無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10