最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue組件通信入門之Provide和Inject機(jī)制

 更新時(shí)間:2019年12月29日 08:49:56   作者:Tomatoro  
這篇文章主要給大家介紹了關(guān)于Vue組件通信入門之Provide和Inject機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue組件通信具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

Vue中父組件到子組件的通信主要由子組件的props屬性實(shí)現(xiàn)。但是在一些情況下,父組件無(wú)法直接向子組件的props傳值。比如子組件通過(guò)父組件的slot進(jìn)入父組件,父組件根本不知道子組件是誰(shuí),更不用說(shuō)用子組件的props了。這時(shí)應(yīng)該怎么辦呢?Vue在2.2.0版本引入了provide與inject,正好適合處理這一情況。

什么是provide與inject

用文檔的話說(shuō):

provide/inject需要一起使用,以允許一個(gè)祖先組件向其所有子孫后代注入一個(gè)依賴,不論組件層次有多深,并在起上下游關(guān)系成立的時(shí)間里始終生效。如果你熟悉 React,這與 React 的上下文特性很相似。

這就是說(shuō)從父組件的provide屬性傳入一個(gè)對(duì)象,子組件(或者是孫組件,只要是子級(jí)組件)可以用inject屬性接收父組件的provide屬性。比如

// main.vue
<template>
  <c1 message="hello world">
    <c2></c2>
  </c1>
</template>
 
// c1.vue
<template>
 <div id="c1">
  <slot></slot>
 </div>
</template>
 
<script>
export default {
 props: ['message'],
 provide () {
  return {
   message: this.message
  }
 }
}
</script>
 
// c2.vue
<template>
 <div id="c2">
   {{ message }}
 </div>
</template>
 
<script>
export default {
 inject: ['message']
}
</script>

上面的main組件會(huì)被渲染為:

<div id="c1">
 <div id= "c2">hello world</div>
</div>

可以看到,c1組件在不清楚子組件是什么的情況下,將它的props中的message傳給了c2組件。在這里c1組件就像是一個(gè)數(shù)據(jù)源一樣,為子組件提供數(shù)據(jù)。但是,c1組件提供的數(shù)據(jù)僅在c1的子孫組件中可見,因此可以算作是有作用域限定的數(shù)據(jù)源。

父到子孫組件方向的數(shù)據(jù)流

父到子孫組件方向是provide/inject機(jī)制設(shè)計(jì)時(shí)的數(shù)據(jù)流方向。我們可能會(huì)猜想,在父組件中更改provide的值,子組件會(huì)響應(yīng)式的發(fā)生改變。但是注意到文檔中話。

提示:provide和inject綁定并不是可響應(yīng)的。這是刻意為之的。然而,如果你傳入了一個(gè)可監(jiān)聽的對(duì)象,那么其對(duì)象的屬性還是可響應(yīng)的。

這意味著,如果provide的值不是可監(jiān)聽對(duì)象時(shí),在父組件中更改provide的值,子組件不會(huì)發(fā)生任何變化。比如模板仍然為上面那個(gè)例子的模板,message的值是一個(gè)props屬性,不是可監(jiān)聽對(duì)象,如果我們?cè)赾1的mounted鉤子函數(shù)里改變message的值。如:

// c1.vue
<script>
export default {
 //...
 mounted () {
  setTimeout( () => {
   this.message = 'Opps, it would not be rendered'
  }, 1000)
 }
}
</script>

子組件不會(huì)響應(yīng)修改后的值。

但是如果provide的值是一個(gè)可監(jiān)聽對(duì)象呢?請(qǐng)看一下例子:

<script>
// c1.vue
export default {
 data () {
  return {
   message: 'hello world'
  }
 },
 provide () {
  messageData: this.$data
 },
 mounted () {
  setTimeout(() => {
   this.message = 'I can show in c2.'
  }, 10000)
 }
}
</script>
 
// c2.vue
<template>
 <div id="c2">
  {{ messageData.message }}
 </div>
</template>
 
<script>
export default {
 inject: ['messageData']
}
</script>

此時(shí)在c1掛載10s后,子組件將會(huì)顯示I can show in c2。為什么呢?c2中messageData實(shí)際上就是c1實(shí)例的this.$data。而this.$data上有message的響應(yīng)式getter與setter。所以c2的視圖會(huì)被message的dep收集,因此在c1中更新message,c2的視圖也會(huì)更新。

縱觀整個(gè)過(guò)程,provide/inject機(jī)制是非響應(yīng)式的,即provide與inject之間沒(méi)有綁定。具體的值是在子組件初始化過(guò)程中決定的。

總結(jié)

provide/inject提供了一種新的組件間通信的方法。它允許父組件向子孫組件間進(jìn)行跨層級(jí)的數(shù)據(jù)分發(fā)。但是provide/inject是非響應(yīng)式的,如果要子孫組件根據(jù)父組件的值進(jìn)行改變,provide/inject機(jī)制不是一個(gè)好的選擇。此時(shí)可以使用Vuex來(lái)管理狀態(tài)。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • vue-cli+webpack項(xiàng)目打包到服務(wù)器后,ttf字體找不到的解決操作

    vue-cli+webpack項(xiàng)目打包到服務(wù)器后,ttf字體找不到的解決操作

    這篇文章主要介紹了vue-cli+webpack項(xiàng)目打包到服務(wù)器后,ttf字體找不到的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • ES6 Proxy實(shí)現(xiàn)Vue的變化檢測(cè)問(wèn)題

    ES6 Proxy實(shí)現(xiàn)Vue的變化檢測(cè)問(wèn)題

    Vue3.0將采用ES6 Proxy的形式重新實(shí)現(xiàn)Vue的變化檢測(cè),在官方還沒(méi)給出新方法之前,我們先實(shí)現(xiàn)一個(gè)基于Proxy的變化檢測(cè)。感興趣的朋友跟隨小編一起看看吧
    2019-06-06
  • 基于 Vue 實(shí)現(xiàn)一個(gè)酷炫的 menu插件

    基于 Vue 實(shí)現(xiàn)一個(gè)酷炫的 menu插件

    本文給大家介紹基于 Vue 實(shí)現(xiàn)一個(gè)酷炫的 menu插件,此篇教程需要大家具備一定的css和vue基礎(chǔ)知識(shí),本文分步驟給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2017-11-11
  • 八個(gè)一看就覺得很棒的Vue開發(fā)技巧分享

    八個(gè)一看就覺得很棒的Vue開發(fā)技巧分享

    在用Vue開發(fā)的這幾年里,我學(xué)到了很多有用的技巧,所以這篇文章主要給大家分享介紹了八個(gè)一看就覺得很棒的Vue開發(fā)技巧,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Vue3中導(dǎo)航守衛(wèi)的使用教程

    Vue3中導(dǎo)航守衛(wèi)的使用教程

    在Vue3中,導(dǎo)航守衛(wèi)(Navigation Guards)用于在路由切換前后執(zhí)行一些操作,例如驗(yàn)證用戶權(quán)限、取消路由導(dǎo)航等,本文主要為大家介紹了vue3中導(dǎo)航守衛(wèi)的使用方法,需要的可以參考下
    2023-08-08
  • Vue API中setup ref reactive函數(shù)使用教程

    Vue API中setup ref reactive函數(shù)使用教程

    setup是用來(lái)寫組合式api,內(nèi)部的數(shù)據(jù)和方法需要通過(guò)return之后,模板才能使用。在之前vue2中,data返回的數(shù)據(jù),可以直接進(jìn)行雙向綁定使用,如果我們把setup中數(shù)據(jù)類型直接雙向綁定,發(fā)現(xiàn)變量并不能實(shí)時(shí)響應(yīng)。接下來(lái)就詳細(xì)看看它們的使用
    2022-12-12
  • vue組件庫(kù)的在線主題編輯器的實(shí)現(xiàn)思路

    vue組件庫(kù)的在線主題編輯器的實(shí)現(xiàn)思路

    這篇文章主要介紹了vue組件庫(kù)的在線主題編輯器的實(shí)現(xiàn)思路,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • vue element-ui實(shí)現(xiàn)動(dòng)態(tài)面包屑導(dǎo)航

    vue element-ui實(shí)現(xiàn)動(dòng)態(tài)面包屑導(dǎo)航

    這篇文章主要為大家詳細(xì)介紹了vue element-ui實(shí)現(xiàn)動(dòng)態(tài)面包屑導(dǎo)航,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Mock.js在Vue項(xiàng)目中的使用小結(jié)

    Mock.js在Vue項(xiàng)目中的使用小結(jié)

    這篇文章主要介紹了Mock.js在Vue項(xiàng)目中的使用,在vue.config.js中配置devServer,在before屬性中引入接口路由函數(shù),詳細(xì)步驟跟隨小編通過(guò)本文學(xué)習(xí)吧
    2022-07-07
  • 15分鐘學(xué)會(huì)vue項(xiàng)目改造成SSR(小白教程)

    15分鐘學(xué)會(huì)vue項(xiàng)目改造成SSR(小白教程)

    這篇文章主要介紹了15分鐘學(xué)會(huì)vue項(xiàng)目改造成SSR(小白教程),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12

最新評(píng)論

连平县| 合肥市| 洪洞县| 乌兰察布市| 五台县| 佛冈县| 五指山市| 黄山市| 永城市| 富顺县| 大厂| 汽车| 惠来县| 建始县| 漳浦县| 永德县| 晋宁县| 海宁市| 延边| 师宗县| 观塘区| 文成县| 合肥市| 庐江县| 屯门区| 元江| 嵊州市| 盈江县| 林州市| 波密县| 岳西县| 黑山县| 仙游县| 福建省| 汉沽区| 稷山县| 阳山县| 武清区| 双流县| 张家口市| 衡水市|