Vue3中依賴注入provide、inject的使用
一、Prop 逐級(jí)透傳問題
vue中我們要從父組件向子組件傳遞數(shù)據(jù)時(shí),會(huì)使用 props。
如果需要給深層子組件傳遞數(shù)據(jù),會(huì)非常麻煩,
如下圖:

provide 和 inject 可以幫助我們解決這一問題。
一個(gè)父組件相對(duì)于其所有的后代組件,會(huì)作為依賴提供者。
任何后代的組件樹,無論層級(jí)有多深,都可以注入由父組件提供給整條鏈路的依賴。

二、Provide (提供)
要為組件后代提供數(shù)據(jù),需要使用到 provide() 函數(shù):

如果不使用 <script setup>,請(qǐng)確保 provide() 是在 setup() 同步調(diào)用的:

provide() 函數(shù)接收兩個(gè)參數(shù)。第一個(gè)參數(shù)被稱為注入名,可以是一個(gè)字符串或是一個(gè) Symbol。
后代組件會(huì)用注入名來查找期望注入的值。
一個(gè)組件可以多次調(diào)用 provide(),使用不同的注入名,注入不同的依賴值。
第二個(gè)參數(shù)是提供的值,值可以是任意類型,包括響應(yīng)式的狀態(tài),比如一個(gè) ref:

提供的響應(yīng)式狀態(tài)使后代組件可以由此和提供者建立響應(yīng)式的聯(lián)系。
三、應(yīng)用層 Provide
除了在一個(gè)組件中提供依賴,我們還可以在整個(gè)應(yīng)用層面提供依賴:

在應(yīng)用級(jí)別提供的數(shù)據(jù)在該應(yīng)用內(nèi)的所有組件中都可以注入。
這在你編寫插件時(shí)會(huì)特別有用,因?yàn)椴寮话愣疾粫?huì)使用組件形式來提供值。
四、Inject (注入)
要注入上層組件提供的數(shù)據(jù),需使用 inject() 函數(shù):

如果提供的值是一個(gè) ref,注入進(jìn)來的會(huì)是該 ref 對(duì)象,而不會(huì)自動(dòng)解包為其內(nèi)部的值。
這使得注入方組件能夠通過 ref 對(duì)象保持了和供給方的響應(yīng)性鏈接。
同樣的,如果沒有使用 <script setup>,inject() 需要在 setup() 內(nèi)同步調(diào)用:

五、注入默認(rèn)值
默認(rèn)情況下,inject 假設(shè)傳入的注入名會(huì)被某個(gè)祖先鏈上的組件提供。
如果該注入名的確沒有任何組件提供,則會(huì)拋出一個(gè)運(yùn)行時(shí)警告。
如果在注入一個(gè)值時(shí)不要求必須有提供者,那么我們應(yīng)該聲明一個(gè)默認(rèn)值,和 props 類似:


在一些場景中,默認(rèn)值可能需要通過調(diào)用一個(gè)函數(shù)或初始化一個(gè)類來取得。
為了避免在用不到默認(rèn)值的情況下進(jìn)行不必要的計(jì)算或產(chǎn)生副作用,我們可以使用工廠函數(shù)來創(chuàng)建默認(rèn)值:

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)移動(dòng)端圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動(dòng)端圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
ElementPlus表單rules校驗(yàn)的方法步驟
相信大家經(jīng)常都會(huì)遇到要處理表單驗(yàn)證的環(huán)節(jié),而我在最近的項(xiàng)目中也遇到需要做表單驗(yàn)證的業(yè)務(wù),下面這篇文章主要給大家介紹了關(guān)于ElementPlus表單rules校驗(yàn)的方法步驟,需要的朋友可以參考下2023-04-04
vue自動(dòng)路由-單頁面項(xiàng)目(非build時(shí)構(gòu)建)
這篇文章主要介紹了vue自動(dòng)路由-單頁面項(xiàng)目(非build時(shí)構(gòu)建),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Vue $emit()不能觸發(fā)父組件方法的原因及解決
這篇文章主要介紹了Vue $emit()不能觸發(fā)父組件方法的原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Vue3使用vant檢索組件van-search遇到的問題小結(jié)
當(dāng)清空按鈕與檢索按鈕同時(shí)居右時(shí),點(diǎn)擊clear清空按鈕事件時(shí)會(huì)同時(shí)觸發(fā)click-right-icon事件,這個(gè)時(shí)候容易觸發(fā)一系列問題,小編小編給大家分享Vue3使用vant檢索組件van-search遇到的問題小結(jié),感興趣的朋友一起看看吧2024-02-02

