Vue組合式API如何正確解構(gòu)props不會丟失響應(yīng)性
解構(gòu) props
編譯器宏 defineProps()
可以輔助讀寫提供給 <script setup>
中的組件的 props
:
上述示例中,props
是一個(gè)響應(yīng)式對象,包含了提供給組件的 props
。如果組件 props
變化了,props
響應(yīng)式對象也會隨之變化。
讀寫 props
對象時(shí),我們要做的第一件事可能是,解構(gòu) props
對象,然后讀寫各個(gè)屬性。但當(dāng)我學(xué)習(xí) Vue 組合式 API 時(shí),令我大吃一驚的是,解構(gòu)的 props
丟失了響應(yīng)性!
讓我們來看一個(gè)例子。下述組件 <EvenOdd :count="5">
接受 count
屬性作為數(shù)字,并顯示一條消息,無論 count
是偶數(shù)還是奇數(shù)。
在解構(gòu) props
對象 const { count } = defineProps()
之后,訪問該 count
屬性:
單擊幾次增加按鈕。您會注意到,盡管 count
屬性不斷累加,但 "The number is even"
消息始終保持不變。
當(dāng)解構(gòu) props
對象 const { count } = defineProps()
時(shí),響應(yīng)性就會丟失。
響應(yīng)性之所以會丟失,是因?yàn)樵诮鈽?gòu)時(shí) count
變異為具有原始值的變量(一個(gè)平平無奇的數(shù)字罷了)。但 Vue 的響應(yīng)性不能直接作用于原始值:Vue 必須訴諸 ref
或響應(yīng)式對象。
粉絲請注意,在 Vue 中將原始值直接賦值給變量時(shí)要小心:此乃丟失響應(yīng)性的前提。
解決方案 1:使用“props”對象
第一個(gè)顯而易見的解決方案是,不要解構(gòu) props
對象,并使用屬性讀寫器直接讀寫 props
: props.count
。
上述示例中,讀寫 computed()
內(nèi)的 props.count
可以在 props.count
變更時(shí)保留響應(yīng)性。props
對象是響應(yīng)式的,對其進(jìn)行任何變更都會被正確追蹤。
這種方案的短板是,我們必須始終使用屬性讀寫器(比如 props.count
)來讀寫 <script setup
中的 prop
。
解決方案 2:使用 toRefs() 輔助函數(shù)
如果您閱讀至此,我敢打賭您是解構(gòu)賦值的忠實(shí)粉絲,并且沒有它就活不下去。
問題不大,那么您可以有意識地將 props
對象的每個(gè)屬性轉(zhuǎn)換為 ref
,來保留解構(gòu) props
的響應(yīng)性。Vue 提供了一個(gè)特殊的輔助函數(shù) toRefs(reactiveObject)
來精準(zhǔn)完成此操作。
其工作機(jī)制如下:
toRefs(props)
返回一個(gè)對象,其中每個(gè)屬性都是對相應(yīng) prop
的 ref
。
現(xiàn)在解構(gòu) const { count } = toRefs(props)
是安全的,因?yàn)?nbsp;count
是基于 count
屬性的 ref
?,F(xiàn)在,每次 count
屬性變更時(shí),count
的 ref
都會響應(yīng)屬性更改。
將 count
作為 ref
,在 computed()
內(nèi),我們必須使用 count.value
讀寫 prop
的值(因?yàn)?nbsp;count.value
是我們讀寫 ref
的值的方式)。
我發(fā)現(xiàn)此方案可以方便地將 prop ref
作為參數(shù)傳遞給組合式函數(shù):比如 useMyComposable(count)
,并且不會丟失響應(yīng)性。
否則,我會堅(jiān)持之前的方案,直接使用 props
對象讀寫 prop
。
總結(jié)
粉絲請注意,通過應(yīng)用解構(gòu) const { propA, propB } = defineProps()
,我們會丟失 props
的響應(yīng)性。
解決響應(yīng)性丟失的方案主要有兩種:
不解構(gòu)
props
,而是訴諸屬性讀寫器直接讀寫props
:比如props.xxx/props.cat
。有意識地使用
props
作為refs
的對象:const { propA, propB } = toRefs(props)
。這保留了解構(gòu)后的響應(yīng)性。然后我們可以將屬性作為獨(dú)立ref
讀寫,比如propsA.value/propB.value
等。
免責(zé)聲明
本文屬于是語冰的直男翻譯了屬于是,略有刪改,僅供粉絲參考,英文原味版請傳送 How to Destructure Props in Vue (Composition API)
以上就是Vue組合式API如何正確解構(gòu)props不會丟失響應(yīng)性的詳細(xì)內(nèi)容,更多關(guān)于Vue組合式API解構(gòu)props的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue結(jié)合axios與后端進(jìn)行ajax交互的方法
本篇文章主要介紹了vue結(jié)合axios與后端進(jìn)行ajax交互的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07vue 實(shí)現(xiàn)通過手機(jī)發(fā)送短信驗(yàn)證碼注冊功能
這篇文章主要介紹了vue 實(shí)現(xiàn)通過手機(jī)發(fā)送短信驗(yàn)證碼注冊功能的相關(guān)資料,需要的朋友可以參考下2018-04-04Vue3使用Echarts導(dǎo)致tooltip失效問題及解決方法
Vue3 使用 proxy 對象代理,而 echarts 則使用了大量的全等(===), 對比失敗從而導(dǎo)致了bug,這篇文章主要介紹了Vue3使用Echarts導(dǎo)致tooltip失效問題及解決方法,需要的朋友可以參考下2023-08-08關(guān)于vue路由緩存清除在main.js中的設(shè)置
今天小編就為大家分享一篇關(guān)于vue路由緩存清除在main.js中的設(shè)置,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11vue-cli項(xiàng)目中img如何使用require動態(tài)獲取圖片
這篇文章主要介紹了vue-cli項(xiàng)目中img如何使用require動態(tài)獲取圖片,具有很好的參考價(jià)值,希望對大家有所幫助。2022-09-09Element-Plus Select組件實(shí)現(xiàn)滾動分頁加載功能
Element-Plus的select組件并沒有自帶滾動分頁加載的功能,其雖然提供了自定義下拉菜單的底部的方式可以自定義上一頁及下一頁操作按鈕的方式進(jìn)行分頁加載切換,這篇文章主要介紹了Element-Plus Select組件實(shí)現(xiàn)滾動分頁加載功能,需要的朋友可以參考下2024-03-03vue項(xiàng)目中運(yùn)用webpack動態(tài)配置打包多種環(huán)境域名的方法
本人分享一個(gè)vue項(xiàng)目里,根據(jù)命令行輸入不同的命令,打包出不同環(huán)境域名的方法。需要的朋友跟隨小編一起看看吧2019-06-06使用vue3實(shí)現(xiàn)element-plus的主題切換效果
Vue3 Element Plus是一個(gè)基于Vue 3框架的UI組件庫,它是由Element UI團(tuán)隊(duì)開發(fā)的升級版本,Element Plus延續(xù)了Element UI簡潔、高效的風(fēng)格,并引入了一些新的設(shè)計(jì)語言和技術(shù),如響應(yīng)式API和更好的性能優(yōu)化,本文給大家介紹了如何使用vue3實(shí)現(xiàn)element-plus的主題切換效果2024-12-12