vue3中?provide?和?inject?用法小結(jié)
前言:
在父子組件傳遞數(shù)據(jù)時(shí),通常使用的是 props 和 emit,父?jìng)髯訒r(shí),使用的是 props,如果是父組件傳孫組件時(shí),就需要先傳給子組件,子組件再傳給孫組件,如果多個(gè)子組件或多個(gè)孫組件使用時(shí),就需要傳很多次,會(huì)很麻煩。
像這種情況,可以使用 provide 和 inject 解決這種問(wèn)題,不論組件嵌套多深,父組件都可以為所有子組件或?qū)O組件提供數(shù)據(jù),父組件使用 provide 提供數(shù)據(jù),子組件或?qū)O組件 inject 注入數(shù)據(jù)。同時(shí)兄弟組件之間傳值更方便。
一、Vue2 的 provide / inject 使
用provide :是一個(gè)對(duì)象,里面是屬性和值。如:
provide:{ info:"值" }
如果 provide 需要使用 data 內(nèi)的數(shù)據(jù)時(shí),這樣寫(xiě)就會(huì)報(bào)錯(cuò)。訪問(wèn)組件實(shí)例 property 時(shí),需要將 provide 轉(zhuǎn)換為返回對(duì)象的函數(shù)。
provide(){ return{ info: this.msg } }
inject :是一個(gè)字符串?dāng)?shù)組。如:
inject: [ 'info' ]
接收上邊 provide 提供的 info 數(shù)據(jù),也可以是一個(gè)對(duì)象,該對(duì)象包含 from 和 default 屬性,from 是可用做的注入內(nèi)容中搜索用的 key,default 屬性是指定默認(rèn)值。
在 vue2 中 project / inject 應(yīng)用:
//父組件
export default{ provide:{ info:"提供數(shù)據(jù)" } }
//子組件
export default{ inject:['info'], mounted(){ console.log("接收數(shù)據(jù):", this.info) // 接收數(shù)據(jù):提供數(shù)據(jù) } }
provide / inject 類(lèi)似于消息的訂閱和發(fā)布。provide 提供或發(fā)送數(shù)據(jù), inject 接收數(shù)據(jù)。
二、Vue3 的 provide / inject 使用
在組合式 API 中使用 provide/inject,兩個(gè)只能在 setup 期間調(diào)用,使用之前,必須從 vue 顯示導(dǎo)入 provide/inject 方法。
provide 函數(shù)接收兩個(gè)參數(shù):
provide( name,value )
name:定義提供 property 的 name 。
value :property 的值。
使用時(shí):
import { provide } from "vue" export default { setup(){ provide('info',"值") } }
inject 函數(shù)有兩個(gè)參數(shù):
inject(name,default)
name:接收 provide 提供的屬性名。
default:設(shè)置默認(rèn)值,可以不寫(xiě),是可選參數(shù)。
使用時(shí):
import { inject } from "vue" export default { setup(){ inject('info',"設(shè)置默認(rèn)值") } }
完整實(shí)例1:provide/inject實(shí)例
//父組件代碼
<script> import { provide } from "vue" export default { setup(){ provide('info',"值") } } </script>
//子組件 代碼
<template> {{info}} </template> <script> import { inject } from "vue" export default { setup(){ const info = inject('info') return{ info } } } </script>
三、添加響應(yīng)性
為了給 provide/inject 添加響應(yīng)性,使用 ref 或 reactive 。
完整實(shí)例2:provide/inject 響應(yīng)式
//父組件代碼 <template> <div> info:{{info}} <InjectCom ></InjectCom> </div> </template> <script> import InjectCom from "./InjectCom" import { provide,readonly,ref } from "vue" export default { setup(){ let info = ref("今天你學(xué)習(xí)了嗎?") setTimeout(()=>{ info.value = "不找借口,立馬學(xué)習(xí)" },2000) provide('info',info) return{ info } }, components:{ InjectCom } } </script>
// InjectCom 子組件代碼 <template> {{info}} </template> <script> import { inject } from "vue" export default { setup(){ const info = inject('info') setTimeout(()=>{ info.value = "更新" },2000) return{ info } } } </script>
上述示例,在父組件或子組件都會(huì)修改 info 的值。
provide / inject 類(lèi)似于消息的訂閱和發(fā)布,遵循 vue 當(dāng)中的單項(xiàng)數(shù)據(jù)流,什么意思呢?就是數(shù)據(jù)在哪,修改只能在哪,不能在數(shù)據(jù)傳遞處修改數(shù)據(jù),容易造成狀態(tài)不可預(yù)測(cè)。
在訂閱組件內(nèi)修改值的時(shí)候,可以被正常修改,如果其他組件也使用該值的時(shí)候,狀態(tài)容易造成混亂,所以需要在源頭上規(guī)避問(wèn)題。
到此這篇關(guān)于vue3中 provide 和 inject 用法的文章就介紹到這了,更多相關(guān)vue3 provide 和 inject 用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue后臺(tái)實(shí)現(xiàn)點(diǎn)擊圖片放大功能的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Vue實(shí)現(xiàn)點(diǎn)擊圖片放大功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-12-12vue頁(yè)面使用阿里oss上傳功能的實(shí)例(二)
本篇文章主要介紹了vue頁(yè)面使用阿里oss上傳功能的實(shí)例(二),主要介紹OSS管理控制臺(tái)設(shè)置訪問(wèn)權(quán)限、角色等,有興趣的可以了解一下2017-08-08Element-UI 解決el-table中圖片懸浮被遮擋問(wèn)題小結(jié)
在開(kāi)發(fā)中,發(fā)現(xiàn)element-ui在el-table中添加圖片懸浮顯示時(shí),會(huì)被單元格遮擋的問(wèn)題,對(duì)于此問(wèn)題解決其實(shí)也并不難,將懸浮圖片放在body節(jié)點(diǎn)下,通過(guò)定位顯示即可,感興趣的朋友跟隨小編一起看看吧2024-06-06Vue前端如何設(shè)置Cookie和鑒權(quán)問(wèn)題詳解
這篇文章主要介紹了前端如何設(shè)置和使用Cookie,并對(duì)比了Cookie和Token在鑒權(quán)中的優(yōu)缺點(diǎn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02vue el-table 動(dòng)態(tài)添加行與刪除行的實(shí)現(xiàn)
這篇文章主要介紹了vue el-table 動(dòng)態(tài)添加行與刪除行的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07解決找不到模塊“xxx.vue”或其相應(yīng)的類(lèi)型聲明問(wèn)題
這篇文章主要介紹了解決找不到模塊“xxx.vue”或其相應(yīng)的類(lèi)型聲明問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-10-10