vue3.x?的shallowReactive?與?shallowRef?使用場景分析
在 Vue 3.x 中,shallowReactive 和 shallowRef 是兩個用于創(chuàng)建淺層響應(yīng)式數(shù)據(jù)的 API。它們與 reactive 和 ref 類似,但在處理嵌套對象時的行為有所不同。以下是它們的詳細(xì)解讀和示例。
1. shallowReactive
作用
shallowReactive 創(chuàng)建一個淺層響應(yīng)式對象,只有對象的頂層屬性是響應(yīng)式的,嵌套對象的屬性不會轉(zhuǎn)換為響應(yīng)式。
使用場景
- 當(dāng)你只需要對象的頂層屬性是響應(yīng)式,而不關(guān)心嵌套對象的響應(yīng)性時。
- 當(dāng)嵌套對象的響應(yīng)性轉(zhuǎn)換可能帶來性能開銷時。
示例
import { shallowReactive, effect } from 'vue';
const state = shallowReactive({
foo: 1,
nested: {
bar: 2,
},
});
effect(() => {
console.log('foo changed:', state.foo); // 響應(yīng)式
});
effect(() => {
console.log('nested.bar changed:', state.nested.bar); // 非響應(yīng)式
});
state.foo = 10; // 觸發(fā)第一個 effect
state.nested.bar = 20; // 不會觸發(fā)第二個 effect解釋:
state.foo是響應(yīng)式的,修改它會觸發(fā)依賴更新。state.nested.bar不是響應(yīng)式的,修改它不會觸發(fā)依賴更新。
2. shallowRef
作用
shallowRef 創(chuàng)建一個淺層響應(yīng)式引用,只有 .value 屬性本身是響應(yīng)式的,而 .value 內(nèi)部的屬性不會轉(zhuǎn)換為響應(yīng)式。
使用場景
- 當(dāng)你只需要
.value是響應(yīng)式的,而不關(guān)心.value內(nèi)部屬性的響應(yīng)性時。 - 當(dāng)
.value是一個復(fù)雜對象,且不需要深度監(jiān)聽時。
示例
import { shallowRef, effect } from 'vue';
const count = shallowRef({
value: 1,
});
effect(() => {
console.log('count changed:', count.value.value); // 非響應(yīng)式
});
count.value.value = 10; // 不會觸發(fā) effect
count.value = { value: 20 }; // 觸發(fā) effect解釋:
count.value是響應(yīng)式的,修改它會觸發(fā)依賴更新。count.value.value不是響應(yīng)式的,但直接修改count.value會觸發(fā)依賴更新。
3. shallowReactive 與 shallowRef 的區(qū)別
| 特性 | shallowReactive | shallowRef |
|---|---|---|
| 作用對象 | 對象 | 任意值(通常用于對象或復(fù)雜數(shù)據(jù)) |
| 響應(yīng)式范圍 | 只有頂層屬性是響應(yīng)式的 | 只有 .value 是響應(yīng)式的 |
| 嵌套對象處理 | 嵌套對象的屬性不是響應(yīng)式的 | .value 內(nèi)部的屬性不是響應(yīng)式的 |
| 典型使用場景 | 只需要頂層屬性響應(yīng)式的對象 | 只需要 .value 響應(yīng)式的引用 |
4. shallowReactive 與 reactive 的對比
reactive 的深度響應(yīng)式
import { reactive, effect } from 'vue';
const state = reactive({
foo: 1,
nested: {
bar: 2,
},
});
effect(() => {
console.log('nested.bar changed:', state.nested.bar); // 響應(yīng)式
});
state.nested.bar = 20; // 觸發(fā) effectreactive 會將整個對象及其嵌套屬性都轉(zhuǎn)換為響應(yīng)式。
shallowReactive 的淺層響應(yīng)式
import { shallowReactive, effect } from 'vue';
const state = shallowReactive({
foo: 1,
nested: {
bar: 2,
},
});
effect(() => {
console.log('nested.bar changed:', state.nested.bar); // 非響應(yīng)式
});
state.nested.bar = 20; // 不會觸發(fā) effectshallowReactive 只將頂層屬性轉(zhuǎn)換為響應(yīng)式,嵌套屬性保持不變。
5. shallowRef 與 ref 的對比
ref 的深度響應(yīng)式
import { ref, effect } from 'vue';
const count = ref({
value: 1,
});
effect(() => {
console.log('count.value changed:', count.value.value); // 響應(yīng)式
});
count.value.value = 10; // 觸發(fā) effectref 會將 .value 及其內(nèi)部屬性都轉(zhuǎn)換為響應(yīng)式。
shallowRef 的淺層響應(yīng)式
import { shallowRef, effect } from 'vue';
const count = shallowRef({
value: 1,
});
effect(() => {
console.log('count.value changed:', count.value.value); // 非響應(yīng)式
});
count.value.value = 10; // 不會觸發(fā) effect
count.value = { value: 20 }; // 觸發(fā) effectshallowRef 只將 .value 本身轉(zhuǎn)換為響應(yīng)式,內(nèi)部屬性保持不變。
6. 使用場景總結(jié)
shallowReactive
- 適用于只需要頂層屬性響應(yīng)式的對象。
- 例如:表單數(shù)據(jù)的頂層字段。
shallowRef
- 適用于只需要
.value響應(yīng)式的引用。 - 例如:DOM 元素的引用或不需要深度監(jiān)聽的對象。
7. 注意事項(xiàng)
性能優(yōu)化:
shallowReactive 和 shallowRef 可以減少不必要的響應(yīng)式轉(zhuǎn)換,從而提高性能。
嵌套對象的響應(yīng)性:
如果需要嵌套對象的響應(yīng)性,應(yīng)該使用 reactive 或 ref。
.value 的使用:
shallowRef 的 .value 是響應(yīng)式的,但 .value 內(nèi)部的屬性不是響應(yīng)式的。
8. 總結(jié)
shallowReactive和shallowRef是 Vue 3 提供的淺層響應(yīng)式 API。shallowReactive只將對象的頂層屬性轉(zhuǎn)換為響應(yīng)式。shallowRef只將.value本身轉(zhuǎn)換為響應(yīng)式。- 它們適用于需要優(yōu)化性能或不需要深度響應(yīng)式的場景。
通過合理使用 shallowReactive 和 shallowRef,可以在保證功能的同時優(yōu)化 Vue 應(yīng)用的性能。
到此這篇關(guān)于vue3.x 的shallowReactive 與 shallowRef 詳細(xì)解讀的文章就介紹到這了,更多相關(guān)vue3.x 的shallowReactive 與 shallowRef 詳細(xì)解讀內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue?webpack打包原理解析(全網(wǎng)最新最全)
webpack是讓我們可以進(jìn)行模塊化開發(fā),并且會幫助我們處理模塊間的依賴關(guān)系,這篇文章主要介紹了vue?webpack打包原理,本篇介紹的有點(diǎn)長,希望大家耐心閱讀2023-02-02
Vue項(xiàng)目打包部署后瀏覽器自動清除緩存問題的解決方法
這篇文章主要介紹了vue打包部署后 瀏覽器緩存問題,導(dǎo)致控制臺報(bào)錯ChunkLoadError: Loading chunk failed的解決方案,文中有相關(guān)的圖文和代碼供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2024-12-12
vue實(shí)現(xiàn)a標(biāo)簽點(diǎn)擊高亮方法
下面小編就為大家分享一篇vue實(shí)現(xiàn)a標(biāo)簽點(diǎn)擊高亮方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Vue3 directive自定義指令內(nèi)部實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Vue3 directive自定義指令內(nèi)部實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
vue封裝可復(fù)用組件confirm,并綁定在vue原型上的示例
今天小編就為大家分享一篇vue封裝可復(fù)用組件confirm,并綁定在vue原型上的示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10
Vue項(xiàng)目組件化工程開發(fā)實(shí)踐方案
這篇文章主要介紹了Vue項(xiàng)目組件化工程開發(fā)實(shí)踐方案,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2018-01-01

