亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解析vue的provide和inject使用方法及其原理

 更新時(shí)間:2021年10月28日 14:44:12   作者:yezi__626  
這篇文章主要介紹了vue的provide和inject使用方法及其原理,本文通過(guò)源碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

首先來(lái)談?wù)勎覀優(yōu)槭裁匆褂胮rovide/inject呢?對(duì)于爺爺和孫子組件之間,甚至太爺爺組件與孫子組件通信我們用vuex不就ok了。

那事實(shí)的確如此,但是,請(qǐng)聽(tīng)我說(shuō)但是,有時(shí)候你項(xiàng)目比較小甚至組件通信的場(chǎng)景很少的,那么你引入vuex就為了那么幾個(gè)通信傳參是不是很浪費(fèi)啊。有人也可能會(huì)想到使用$parent獲取父組件實(shí)例,來(lái)獲取data/methods,這種兩層就還好,那多層呢,組件嵌套很深的話,你怎么弄?寫(xiě)個(gè)函數(shù)把$parent再封裝一下。那不是很麻煩嗎,現(xiàn)成的你不用非要曲線救國(guó)。哈哈~扯遠(yuǎn)了。

不廢話那么多了,就告訴你用provide/inject就是解決你這些問(wèn)題,準(zhǔn)沒(méi)錯(cuò)。讓我們看看如何使用呢?反手就是幾行簡(jiǎn)單的代碼:

1.父組件提供向子組件要傳遞的參數(shù)
provide() {
    return {
      listType: this.listType,
    }
  }
2.子組件使用:
inject: ['listType'],

當(dāng)然,你也可以在inject中指定你的默認(rèn)值和你參數(shù)的來(lái)源:

inject:{
  listType:{
  from:"par"http://provide定義的名字
  default:1
  }
}

好啦!是不是很簡(jiǎn)單呢。其實(shí)就是不管是父組件還是祖先組件都可以向后代組件中注入依賴,無(wú)論組件的層次有多深。

再說(shuō)一些:

provide可以是一個(gè)對(duì)象,也可以是一個(gè)返回對(duì)象的函數(shù)。

inejct:可以是字符串?dāng)?shù)組或者一個(gè)對(duì)象。

有興趣的話再看看下面的源碼部分,也是相當(dāng)容易了解的:

provide的核心源碼:

export function provide<T>(key: InjectionKey<T> | string | number, value: T) {
  if (!currentInstance) {
    if (__DEV__) {
      warn(`provide() can only be used inside setup().`)
    
    }
  } else {
    //獲取當(dāng)前組件的provides,默認(rèn)實(shí)例繼承父類的provides對(duì)象
    let provides = currentInstance.provides
    //使用父provide對(duì)象作為原型來(lái)創(chuàng)建自己的provide對(duì)象
    const parentProvides =
      currentInstance.parent && currentInstance.parent.provides
    if (parentProvides === provides) {
      provides = currentInstance.provides = Object.create(parentProvides)
    }
    provides[key as string] = value
  }
}
​

inject的核心源碼:

export function inject(
  key: InjectionKey<any> | string,
  defaultValue?: unknown,
  treatDefaultAsFactory = false
) {
  //獲取當(dāng)前組件實(shí)例
  const instance = currentInstance || currentRenderingInstance
  if (instance) {
  //獲取provides
    const provides =
      instance.parent == null
        ? instance.vnode.appContext && instance.vnode.appContext.provides
        : instance.parent.provides
​
    if (provides && (key as string | symbol) in provides) {
      //如果key存在就直接返回
      return provides[key as string]
    } else if (arguments.length > 1) {
      //如果key不存在,設(shè)置了默認(rèn)值就直接返回默認(rèn)值
      return treatDefaultAsFactory && isFunction(defaultValue)
        ? defaultValue.call(instance.proxy)
        : defaultValue
    } else if (__DEV__) {
      //如果都沒(méi)有就提示
      warn(`injection "${String(key)}" not found.`)
    }
  } else if (__DEV__) {
    warn(`inject() can only be used inside setup() or functional components.`)
  }
}
​

到此這篇關(guān)于解析vue的provide和inject使用方法及其原理的文章就介紹到這了,更多相關(guān)vue provide和inject使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue-router路由模式詳解(小結(jié))

    vue-router路由模式詳解(小結(jié))

    這篇文章主要介紹了vue-router路由模式詳解(小結(jié)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 使用 Vue 實(shí)現(xiàn)一個(gè)虛擬列表的方法

    使用 Vue 實(shí)現(xiàn)一個(gè)虛擬列表的方法

    這篇文章主要介紹了使用 Vue 實(shí)現(xiàn)一個(gè)虛擬列表的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • vue配置根目錄詳細(xì)步驟(用@代表src目錄)

    vue配置根目錄詳細(xì)步驟(用@代表src目錄)

    vue用@表示src文件夾,引入時(shí)找文件路徑更方便,下面這篇文章主要給大家介紹了關(guān)于vue配置根目錄(用@代表src目錄)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 建立和維護(hù)大型 Vue.js 項(xiàng)目的 10 個(gè)最佳實(shí)踐

    建立和維護(hù)大型 Vue.js 項(xiàng)目的 10 個(gè)最佳實(shí)踐

    這篇文章小編要與大家分享的是建立和維護(hù)大型 Vue.js 項(xiàng)目的 10 個(gè)最佳實(shí)踐,需要的小伙伴請(qǐng)和小編一起學(xué)習(xí)下面文章的具體內(nèi)容吧
    2021-09-09
  • vue中使用svg畫(huà)路徑圖的詳細(xì)介紹

    vue中使用svg畫(huà)路徑圖的詳細(xì)介紹

    這篇文章主要介紹了vue中使用svg畫(huà)路徑圖的相關(guān)知識(shí),在這大家需要注意svg中不能使用html標(biāo)簽,例如div,img等,因此在svg中一般使用image標(biāo)簽放置圖片,text圖片放置文本內(nèi)容,詳細(xì)代碼跟隨小編一起看看吧
    2022-04-04
  • 解決vue2.0 element-ui中el-upload的before-upload方法返回false時(shí)submit()不生效問(wèn)題

    解決vue2.0 element-ui中el-upload的before-upload方法返回false時(shí)submit(

    這篇文章主要介紹了vue2.0 element-ui中el-upload的before-upload方法返回false時(shí)submit()不生效的解決方法,這里需要主要項(xiàng)目中用的element-ui是V1.4.3,感興趣的朋友參考下吧
    2018-08-08
  • vue動(dòng)態(tài)綁定多個(gè)類名方法詳解(:class動(dòng)態(tài)綁定多個(gè)類名)

    vue動(dòng)態(tài)綁定多個(gè)類名方法詳解(:class動(dòng)態(tài)綁定多個(gè)類名)

    vue中可以通過(guò):class=""這樣來(lái)根據(jù)一定的條件來(lái)動(dòng)態(tài)添加class,但是有時(shí)候需要判斷的條件比較多,需要?jiǎng)討B(tài)添加的class也比較多,下面這篇文章主要給大家介紹了關(guān)于vue動(dòng)態(tài)綁定多個(gè)類名(:class動(dòng)態(tài)綁定多個(gè)類名)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Vue實(shí)現(xiàn)電商網(wǎng)站商品放大鏡效果示例

    Vue實(shí)現(xiàn)電商網(wǎng)站商品放大鏡效果示例

    這篇文章主要為大家介紹了Vue實(shí)現(xiàn)電商網(wǎng)站商品放大鏡效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • vue自定義封裝指令以及實(shí)際使用

    vue自定義封裝指令以及實(shí)際使用

    市面上大多數(shù)關(guān)于Vue.js自定義指令的文章都在講語(yǔ)法,很少講實(shí)際的應(yīng)用場(chǎng)景和用例,下面這篇文章主要給大家介紹了關(guān)于vue自定義封裝指令以及實(shí)際使用的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • vue-cli對(duì)element-ui組件進(jìn)行二次封裝的實(shí)戰(zhàn)記錄

    vue-cli對(duì)element-ui組件進(jìn)行二次封裝的實(shí)戰(zhàn)記錄

    組件類似于需要多個(gè)地方用到的方法,在Vue中組件就是一種復(fù)用(經(jīng)常使用)一個(gè)功能的手段,下面這篇文章主要給大家介紹了關(guān)于Vue?element?ui二次封裝的相關(guān)資料,需要的朋友可以參考下
    2022-06-06

最新評(píng)論