>[success] 組件的依賴注入,可以讓子組件直接獲取父組件的屬性和方法。特別是對于嵌套層級比較多的子組件中特別適用。
通常我們可以使用`$parent`獲取父組件的實例,但是當我們的層級比較多的時候,獲取父組件實例就會變成:
```
<google-map>
<google-map-region v-bind:shape="cityBoundaries">
<google-map-markers v-bind:places="iceCreamShops"></google-map-markers>
</google-map-region>
</google-map>
```
```
this.$parent || this.$parent.$parent
```
使用組件的依賴注入可以有效的改善這樣的問題。使用組件的依賴組件需要用到兩個新的實例選項:`provide`和`inject`。
**provide選項指定我們要**提供**給后代組件的數據/方法**。
首先我們要在父組件中定義`provide`選項:
```
//定義我們傳遞給后代組件的屬性或方法
provide: function () {
return {
getMap: this.getMap
}
}
```
在子組件中我們使用`inject`選項進行接收:
```
inject: ['getMap']
```
實際上,你可以把依賴注入看作一部分“大范圍有效的 prop”,除了:
* 祖先組件不需要知道哪些后代組件使用它提供的屬性
* 后代組件不需要知道被注入的屬性來自哪里
>[danger]然而,依賴注入還是有負面影響的。它將你應用程序中的組件與它們當前的組織方式耦合起來,使重構變得更加困難。同時所提供的屬性是非響應式的。這是出于設計的考慮,因為使用它們來創建一個中心化規模化的數據跟[使用`$root`](https://cn.vuejs.org/v2/guide/components-edge-cases.html#%E8%AE%BF%E9%97%AE%E6%A0%B9%E5%AE%9E%E4%BE%8B)做這件事都是不夠好的。如果你想要共享的這個屬性是你的應用特有的,而不是通用化的,或者如果你想在祖先組件中更新所提供的數據,那么這意味著你可能需要換用一個像[Vuex](https://github.com/vuejs/vuex)這樣真正的狀態管理方案了