🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[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)这样真正的状态管理方案了