自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Vue 3 學(xué)習(xí)筆記—Provide 和 Inject 用法及原理

開發(fā) 前端
在父子組件傳遞數(shù)據(jù)時(shí),通常使用的是 props 和 emit,父?jìng)髯訒r(shí),使用的是 props,如果是父組件傳孫組件時(shí),就需要先傳給子組件,子組件再傳給孫組件。

[[439473]]

在父子組件傳遞數(shù)據(jù)時(shí),通常使用的是 props 和 emit,父?jìng)髯訒r(shí),使用的是 props,如果是父組件傳孫組件時(shí),就需要先傳給子組件,子組件再傳給孫組件,如果多個(gè)子組件或多個(gè)孫組件使用時(shí),就需要傳很多次,會(huì)很麻煩。

像這種情況,可以使用 provide 和 inject 解決這種問題,不論組件嵌套多深,父組件都可以為所有子組件或?qū)O組件提供數(shù)據(jù),父組件使用 provide 提供數(shù)據(jù),子組件或?qū)O組件 inject 注入數(shù)據(jù)。同時(shí)兄弟組件之間傳值更方便。

一、Vue2 的 provide / inject 使用

provide :是一個(gè)對(duì)象,里面是屬性和值。如:

  1. provide:{ 
  2.  info:"值" 

 如果 provide 需要使用 data 內(nèi)的數(shù)據(jù)時(shí),這樣寫就會(huì)報(bào)錯(cuò)。訪問組件實(shí)例 property 時(shí),需要將 provide 轉(zhuǎn)換為返回對(duì)象的函數(shù)。

  1. provide(){ 
  2.  return
  3.   info: this.msg 
  4.  } 

 inject :是一個(gè)字符串?dāng)?shù)組。如:

  1. inject: [ 'info' ] 

接收上邊 provide 提供的 info 數(shù)據(jù),也可以是一個(gè)對(duì)象,該對(duì)象包含 from 和 default 屬性,from 是可用做的注入內(nèi)容中搜索用的 key,default 屬性是指定默認(rèn)值。

在 vue2 中 project / inject 應(yīng)用:

  1. //父組件 
  2. export default
  3.  provide:{ 
  4.   info:"提供數(shù)據(jù)" 
  5.  } 
  6. //子組件 
  7. export default
  8.  inject:['info'], 
  9.  mounted(){ 
  10.     console.log("接收數(shù)據(jù):", this.info) // 接收數(shù)據(jù):提供數(shù)據(jù) 
  11.  } 
  12. }  

 provide / inject 類似于消息的訂閱和發(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í):

  1. import { provide } from "vue" 
  2. export default { 
  3.   setup(){ 
  4.     provide('info',"值"
  5.   } 

 inject 函數(shù)有兩個(gè)參數(shù):

inject(name,default)

name:接收 provide 提供的屬性名。

default:設(shè)置默認(rèn)值,可以不寫,是可選參數(shù)。

使用時(shí):

  1. import { inject } from "vue" 
  2. export default { 
  3.   setup(){ 
  4.     inject('info',"設(shè)置默認(rèn)值"
  5.   } 

 完整實(shí)例1:provide/inject實(shí)例

  1. //父組件代碼 
  2. <script> 
  3. import { provide } from "vue" 
  4. export default { 
  5.   setup(){ 
  6.     provide('info',"值"
  7.   } 
  8. </script> 
  9.  
  10. //子組件 代碼 
  11. <template> 
  12.  {{info}} 
  13. </template> 
  14. <script> 
  15. import { inject } from "vue" 
  16. export default { 
  17.   setup(){ 
  18.     const info = inject('info'
  19.     return
  20.       info 
  21.     } 
  22.   } 
  23. </script>  

三、添加響應(yīng)性

為了給 provide/inject 添加響應(yīng)性,使用 ref 或 reactive 。

完整實(shí)例2:provide/inject 響應(yīng)式

  1. //父組件代碼 
  2. <template> 
  3.   <div> 
  4.     info:{{info}} 
  5.     <InjectCom ></InjectCom> 
  6.   </div> 
  7. </template> 
  8. <script> 
  9. import InjectCom from "./InjectCom" 
  10. import { provide,readonly,ref } from "vue" 
  11. export default { 
  12.   setup(){ 
  13.     let info = ref("今天你學(xué)習(xí)了嗎?"
  14.     setTimeout(()=>{ 
  15.       info.value = "不找借口,立馬學(xué)習(xí)" 
  16.     },2000) 
  17.     provide('info',info) 
  18.     return
  19.       info 
  20.     } 
  21.   }, 
  22.   components:{ 
  23.     InjectCom 
  24.   } 
  25. </script> 
  26.  
  27. // InjectCom 子組件代碼 
  28. <template> 
  29.  {{info}} 
  30. </template> 
  31. <script> 
  32. import { inject } from "vue" 
  33. export default { 
  34.   setup(){ 
  35.     const info = inject('info'
  36.     setTimeout(()=>{ 
  37.       info.value = "更新" 
  38.     },2000) 
  39.     return
  40.       info 
  41.     } 
  42.   } 
  43. </script> 

上述示例,在父組件或子組件都會(huì)修改 info 的值。

provide / inject 類似于消息的訂閱和發(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ī)避問題。

readonly 只讀函數(shù),使用之前需要引入,如果給變量加上 readonly 屬性,則該數(shù)據(jù)只能讀取,無法改變,被修改時(shí)會(huì)發(fā)出警告,但不會(huì)改變值。

使用方法:

  1. import { readonly } from "vue" 
  2. let info = readonly('只讀info值'
  3. setTimout(()=>{ 
  4.  info="更新info" //兩秒后更新info的值 
  5. },2000) 

 運(yùn)行兩秒后,瀏覽器發(fā)出警告,提示 info 值不可修改。

所以我們就給provide發(fā)射出去的數(shù)據(jù),添加一個(gè)只讀屬性,避免發(fā)射出去的數(shù)據(jù)被修改。

完整實(shí)例2的 provide 處添加 readonly 。

  1. provide('info', readonly(info)) 

在子組件修改值的時(shí)候,會(huì)有一個(gè)只讀提醒。

修改值的時(shí)候,還是需要在 provide 發(fā)布數(shù)據(jù)的組件內(nèi)修改數(shù)據(jù),所以會(huì)在組件內(nèi)添加修改方法,同時(shí)也發(fā)布出去,在子組件處調(diào)用就可以了。如:

  1. //發(fā)布 
  2. let info = ref("今天你學(xué)習(xí)了嗎?"
  3. const changeInfo = (val)=>{ 
  4.  info.value = val 
  5. provide('info',readonly(info)) 
  6. provide('changeInfo',changeInfo) 
  7.  
  8. //訂閱 
  9. const chang = inject('changeInfo'
  10. chang('沖向前端工程師'

 完整示例3:修改數(shù)據(jù)

  1. // 父組件代碼 
  2. <template> 
  3.   <div> 
  4.     info:{{info}} 
  5.     <InjectCom ></InjectCom> 
  6.   </div> 
  7. </template> 
  8.  
  9. <script> 
  10. import InjectCom from "./InjectCom" 
  11. import { provide,readonly,ref } from "vue" 
  12. export default { 
  13.   setup(){ 
  14.     let info = ref("今天你學(xué)習(xí)了嗎?"
  15.     const changeInfo = (val)=>{ 
  16.       info.value = val 
  17.     } 
  18.     provide('info',readonly(info)) 
  19.     provide('changeInfo',changeInfo) 
  20.     return
  21.       info 
  22.     } 
  23.   }, 
  24.   components:{ 
  25.     InjectCom 
  26.   } 
  27. </script> 
  28.  
  29. //InjectCom 子組件代碼 
  30. <template> 
  31.   <div> 
  32.     <button @click="chang('沖向前端工程師')">更新值</button> 
  33.   </div> 
  34. </template> 
  35. <script> 
  36. import { inject } from "vue" 
  37. export default { 
  38.   setup(){ 
  39.     const info = inject('info'
  40.     const chang = inject('changeInfo'
  41.     return
  42.       info, 
  43.       chang 
  44.     } 
  45.   } 
  46. </script> 

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-05-27 10:36:34

ProvideInjectVue3

2024-12-03 10:40:51

Vue3injectprovide

2021-12-01 08:11:44

Vue3 插件Vue應(yīng)用

2021-12-07 05:44:45

Vue 3 Watch WatchEffect

2021-12-08 09:09:33

Vue 3 Computed Vue2

2023-11-29 08:49:31

Vue.jsData 函數(shù)

2023-11-28 09:03:59

Vue.jsJavaScript

2024-11-11 06:00:00

Vue開發(fā)provide

2020-06-09 11:35:30

Vue 3響應(yīng)式前端

2021-11-16 08:50:29

Vue3 插件Vue應(yīng)用

2021-11-30 08:19:43

Vue3 插件Vue應(yīng)用

2020-12-01 08:34:31

Vue3組件實(shí)踐

2021-12-29 07:51:21

Vue3 插件Vue應(yīng)用

2021-12-02 05:50:35

Vue3 插件Vue應(yīng)用

2023-12-11 07:34:37

Computed計(jì)算屬性Vue3

2024-04-10 08:45:51

Vue 3Proxy對(duì)象監(jiān)測(cè)數(shù)據(jù)

2021-11-17 08:24:47

Vue3 插件Vue應(yīng)用

2023-12-14 08:25:14

WatchVue.js監(jiān)聽數(shù)據(jù)

2010-08-16 15:11:02

DIV

2010-08-26 16:40:35

DIV定位
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)