欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

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

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

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

再說一些:

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

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

有興趣的話再看看下面的源碼部分,也是相當(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)實例繼承父類的provides對象
    let provides = currentInstance.provides
    //使用父provide對象作為原型來創(chuàng)建自己的provide對象
    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)前組件實例
  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__) {
      //如果都沒有就提示
      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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

    建立和維護(hù)大型 Vue.js 項目的 10 個最佳實踐

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

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

    這篇文章主要介紹了vue中使用svg畫路徑圖的相關(guān)知識,在這大家需要注意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時submit()不生效問題

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

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

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

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

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

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

    vue自定義封裝指令以及實際使用

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

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

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

最新評論