readonly
是Vue3中提供的一個新特性,用於將一個響應式物件變成唯讀物件。使用readonly
可以確保一個物件只能被讀取而不能被修改,從而提高應用的穩定性和安全性。
在Vue3中,可以使用readonly
函數將一個物件轉換為唯讀對象,例如:
import { readonly } from 'vue' const state = readonly({ count: 0 })
在上面的程式碼中,state
對像被轉換為唯讀對象,這表示state.count
屬性只能被讀取,而不能被修改。
要注意的是,readonly
函數是遞歸的,也就是說,如果一個物件包含其他對象,那麼這些物件也會被轉換為唯讀物件。例如:
import { readonly } from 'vue' const state = readonly({ user: { name: 'John', age: 30 } })
在上面的程式碼中,user
物件也轉換為唯讀對象,這表示state.user.name
和state .user.age
屬性都只能被讀取,而不能被修改。
要注意的是,readonly
函數只能將一個物件轉換為唯讀對象,而不能將一個陣列或Map等其他類型的資料結構轉換為唯讀對象。如果需要將這些資料結構轉換為唯讀對象,可以使用readonly
函數和deepReadonly
函數的組合。例如:
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
陣列被轉換為唯讀組,其中的對像也被轉換為唯讀對象,這表示陣列和對像都只能被讀取,而不能被修改。
undefined
vue3中的readonly單向資料流函數,傳入一個對象(響應式或普通)或ref,傳回一個原始物件的唯讀代理。一個唯讀的代理是“深層的”,物件內部任何嵌套的屬性也都是唯讀的。
1、readonly函數是將透過ref 或reactive定義好的資料進行拷貝後變為僅可讀的數據,不可進行修改,即無回應
2、如強制修改控制台將會報錯警告
<template> <div> <img alt="Vue logo" src="./assets/logo.png" /> <h2>vue3.0 beta</h2> <h2>{{ original.count }} ----- {{ copy.count }}</h2> <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 上的修改会触发 copy 上的侦听 original.count++; // 无法修改 copy 并会被警告 copy.count++; // warning! return { original, copy }; } }; </script>
可以看到觸發了只2次"watchEffect" 函數,因為copy 是只讀的。
<template> <div> <img alt="Vue logo" src="./assets/logo.png" /> <h2>vue3.0 beta</h2> <h2>{{ refData }} ----- {{ copy }}</h2> </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"
<template> <div> <img alt="Vue logo" src="./assets/logo.png" /> <h2>vue3.0 beta</h2> <h2>{{ original.count }} ----- {{ copy.count }}</h2> <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 上的修改会触发 copy 上的侦听 original.count++; // 无法修改 copy 并会被警告 copy.count++; // warning! const add = () => { copy.count++; }; return { original, copy, add }; } }; </script>
可以看到我們一直點擊按鈕在操作,控制台會提示錯誤,然後介面也沒更新,因為你的資料來源不是響應式的。
以上是Vue3中的readonly特性及函數使用方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!