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

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

不廢話那么多了,就告訴你用provide/inject就是解決你這些問題,準(zhǔn)沒錯(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__) {
      //如果都沒有就提示
      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)文章

  • 關(guān)于Vue3父子組件emit參數(shù)傳遞問題(解決Vue2this.$emit無(wú)效問題)

    關(guān)于Vue3父子組件emit參數(shù)傳遞問題(解決Vue2this.$emit無(wú)效問題)

    相信很多人在利用事件驅(qū)動(dòng)向父組件扔?xùn)|西的時(shí)候,發(fā)現(xiàn)原來(lái)最常用的this.$emit咋報(bào)錯(cuò)了,竟然用不了了,下面通過(guò)本文給大家分享關(guān)于Vue3父子組件emit參數(shù)傳遞問題(解決Vue2this.$emit無(wú)效問題),需要的朋友可以參考下
    2022-07-07
  • VUE 直接通過(guò)JS 修改html對(duì)象的值導(dǎo)致沒有更新到數(shù)據(jù)中解決方法分析

    VUE 直接通過(guò)JS 修改html對(duì)象的值導(dǎo)致沒有更新到數(shù)據(jù)中解決方法分析

    這篇文章主要介紹了VUE 直接通過(guò)JS 修改html對(duì)象的值導(dǎo)致沒有更新到數(shù)據(jù)中解決方法,結(jié)合實(shí)例形式詳細(xì)分析了VUE使用JS修改html對(duì)象的值導(dǎo)致沒有更新到數(shù)據(jù)的原因與解決方法,需要的朋友可以參考下
    2019-12-12
  • Vue快速理解事件綁定是什么

    Vue快速理解事件綁定是什么

    一般在vue項(xiàng)目開發(fā)中,事件的處理邏輯一般很復(fù)雜,我們可以將處理的邏輯變成函數(shù),在vue開發(fā)中,一般使用的是使用的是v-on指令進(jìn)行事件的監(jiān)聽,事件監(jiān)聽的過(guò)程中觸發(fā)相應(yīng)的JavaScript代碼
    2022-08-08
  • 解決Antd Table組件表頭不對(duì)齊的問題

    解決Antd Table組件表頭不對(duì)齊的問題

    這篇文章主要介紹了解決Antd Table組件表頭不對(duì)齊的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • Vue移動(dòng)端用淘寶彈性布局lib-flexible插件做適配的方法

    Vue移動(dòng)端用淘寶彈性布局lib-flexible插件做適配的方法

    這篇文章主要介紹了Vue移動(dòng)端用淘寶彈性布局lib-flexible插件做適配的操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • vue+express+jwt持久化登錄的方法

    vue+express+jwt持久化登錄的方法

    這篇文章主要介紹了vue+express+jwt持久化登錄的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 關(guān)于vue3編寫掛載DOM的插件問題

    關(guān)于vue3編寫掛載DOM的插件問題

    這篇文章主要介紹了vue3編寫掛載DOM的插件的問題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 加快Vue項(xiàng)目的開發(fā)速度的方法

    加快Vue項(xiàng)目的開發(fā)速度的方法

    這篇文章主要介紹了加快Vue項(xiàng)目的開發(fā)速度的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Vue如何引入遠(yuǎn)程JS文件

    Vue如何引入遠(yuǎn)程JS文件

    本篇文章主要介紹了Vue引入遠(yuǎn)程JS文件,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Vue表單控件綁定圖文詳解

    Vue表單控件綁定圖文詳解

    在本文中我們給大家整理了一篇關(guān)于Vue表單控件綁定的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們參考下。
    2019-02-02

最新評(píng)論

德格县| 巧家县| 邹平县| 新郑市| 比如县| 香港| 静安区| 郓城县| 马龙县| 张掖市| 共和县| 永寿县| 湛江市| 郑州市| 繁峙县| 黔西| 万源市| 东乡县| 会同县| 容城县| 西和县| 南宁市| 富裕县| 区。| 凤山市| 电白县| 永年县| 来宾市| 买车| 武汉市| 股票| 宣城市| 安西县| 安新县| 定远县| 九龙坡区| 高唐县| 观塘区| 阿拉善盟| 双牌县| 施甸县|