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