Vue 依賴注入 - Provide/Inject

官網(wǎng)傳送門:inject ?Vue2.2.0+

# 背景

? 關于Vue組件的通訊方式相信大家能倒背如流

  • 父子組件:通過prop$emit健提,【$root雳刺,$parent$children
  • 非父子組件:Vuex實現(xiàn)飒箭,父子層層傳遞轻抱、中央事務總線Bus,$ref

子實例可以用 this.$parent 訪問父實例衷旅,子實例被推入父實例的 $children 數(shù)組中器一。應當節(jié)制地使用它們课锌,其只是作為訪問組件的應急方法。更推薦用 props 和 events 實現(xiàn)父子組件通信.

Vue官網(wǎng)建議祈秕,在正常情況下渺贤,這兩種方式已經(jīng)能滿足絕大多數(shù)甚至所有的業(yè)務需求,對于應用程序代碼應優(yōu)先使用它們處理请毛。然而癣亚,還有一種主要為高階插件/組件庫提供的用例辦法,即provide/inject获印,這對選項需要一起使用。
?

# 功能

? 通常情況下街州,組件向組件傳遞數(shù)據(jù)兼丰,可以采用父子props層層傳遞,也可以使用busVuex直接交互唆缴。在Vue2.2.0之后鳍征,Vue還提供了provide/inject選項

這對選項允許一個祖先組件向其所有子孫后代組件注入一個依賴,不論組件層次有多深面徽,并在起上下游關系成立的時間里始終生效艳丛。

? 也就是說,在父組件只要聲明了provide趟紊,在其子組件氮双,孫組件,曾孫組件等能形成上下游關系的組件中交互霎匈,無論多深都能通過inject來訪問provider中的數(shù)據(jù)戴差。而不是局限于只能從當前父組件的prop屬性來獲取。注意他只做祖先通后代的單向傳遞的一個辦法铛嘱。有人這么形容:

provide就相當于加強版父組件prop暖释,可以跨越中間組件inject就相當于加強版子組件的props
?

# 缺點

? 官網(wǎng)不建議在應用中直接使用該辦法墨吓,理由很直接:他怕你"管不好"

? 設計項目球匕,通常追求有清晰的數(shù)據(jù)流向和合理的組件層級關系便于調(diào)試和維護,然而這對選項支持任意層級都能訪問帖烘,導致數(shù)據(jù)追蹤比較困難亮曹。不知道那一層級聲明了provide又或是哪些層級使用了inject。造成比較大的維護成本。因此乾忱,除組件庫或高階插件外讥珍,Vue建議用Vuex解決或其他辦法處理。
?

# 使用辦法

  • provide 提供變量:Object | () => Object
  • inject 注入變量: Array<string> | { [key: string]: string | Symbol | Object }

? provide 選項應該是一個對象或返回一個對象的函數(shù)窄瘟。 該對象包含可注入其子孫的屬性衷佃。在該對象中,它支持ES6中Symbol作為key蹄葱,但只在原生支持等環(huán)境下可工作氏义。

? inject 選項可以是

  • 一個字符串數(shù)組
  • 一個對象,key為本地綁定名图云,value為:
    • 在可用的注入內(nèi)容中搜索用的key惯悠,或
    • 一個對象,其 from 屬性是在可用的注入內(nèi)容中搜索用的key竣况,default屬性是降級情況下使用的value

提示:provideinject綁定并不是可響應的克婶,這是刻意為之,然而如果你傳入了一個可監(jiān)聽的對象丹泉,那么氣對象的屬性還是可監(jiān)聽的情萤。

?

# 案例展示

在父組件中provide提供變量

<template>
  <div>
    <p>{{ title }}</p>
    <son></son>
  </div>
</template>
<script>
  import Son from "./son"
  export default {
    name: 'Father',
    components: { Son },
    // provide選項提供變量
    provide: {
      message: 'provided by father'
    },
    data () {
      return {
        title: '父組件'
      }
    },
    methods: { ... }
  }
</script>

在子組件中,我們故意不使用任何父組件的信息

<template>
  <div>
    <p>{{ title }}</p>
    <grand-son></grand-son>
  </div>
</template>
<script>
import grandSon from "./grandSon "
export default {
  name: "Son",
  components: { grandSon },
  data () {
    return {
      title: '子組件'
    }
  },
};
</script>

在孫組件中摹恨,使用inject來注入

<template>
  <div>
    <p>message:{{ message }}</p>
  </div>
</template>
<script>
export default {
  name: "GrandSon",
  inject: [ "message" ],
  data () {
    return {
      title: '孫組件'
    }
  },
  methods: { ... }
};
</script>

結果孫組件頁面顯示:
message: provided by father
?

建議

使用依賴注入時筋岛,強烈建議使用命名空間策略,根據(jù)父組件特性對命名空間名稱做規(guī)范晒哄,可以解決不知道哪里提供的問題睁宰。且依賴注入是單向數(shù)據(jù)流,有統(tǒng)一分發(fā)數(shù)據(jù)的優(yōu)勢寝凌,合理使用能提供很大便利性柒傻。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硫兰,隨后出現(xiàn)的幾起案子诅愚,更是在濱河造成了極大的恐慌,老刑警劉巖劫映,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件违孝,死亡現(xiàn)場離奇詭異,居然都是意外死亡泳赋,警方通過查閱死者的電腦和手機雌桑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祖今,“玉大人校坑,你說我怎么就攤上這事拣技。” “怎么了耍目?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵膏斤,是天一觀的道長。 經(jīng)常有香客問我邪驮,道長莫辨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任毅访,我火速辦了婚禮沮榜,結果婚禮上,老公的妹妹穿的比我還像新娘喻粹。我一直安慰自己蟆融,他們只是感情好,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布守呜。 她就那樣靜靜地躺著型酥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪查乒。 梳的紋絲不亂的頭發(fā)上冕末,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音侣颂,去河邊找鬼。 笑死枪孩,一個胖子當著我的面吹牛憔晒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蔑舞,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼拒担,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了攻询?” 一聲冷哼從身側響起从撼,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钧栖,沒想到半個月后低零,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡拯杠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年掏婶,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潭陪。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡雄妥,死狀恐怖最蕾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情老厌,我是刑警寧澤瘟则,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站枝秤,受9級特大地震影響醋拧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宿百,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一趁仙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垦页,春花似錦雀费、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至薄啥,卻和暖如春辕羽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垄惧。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工刁愿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人到逊。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓铣口,卻偏偏與公主長得像,于是被迫代替她去往敵國和親觉壶。 傳聞我的和親對象是個殘疾皇子脑题,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容