Javascript 为什么对Vue';s提供和注入功能?

Javascript 为什么对Vue';s提供和注入功能?,javascript,vue.js,vuejs2,Javascript,Vue.js,Vuejs2,我正在考虑在项目中使用Vue的新提供/注入功能,但在正式的Vue中,它给出了以下警告: 提供和注入主要用于高级插件/组件库用例。不建议在通用应用程序代码中使用它们 然而,文件没有给出原因。在“通用应用程序代码”而不是“高级插件/组件库用例”中使用提供和注入有什么危险 在示例代码中: // parent component providing 'foo' var Provider = { provide: { foo: 'bar' }, // ... } // child c

我正在考虑在项目中使用Vue的新提供/注入功能,但在正式的Vue中,它给出了以下警告:

提供和注入主要用于高级插件/组件库用例。不建议在通用应用程序代码中使用它们

然而,文件没有给出原因。在“通用应用程序代码”而不是“高级插件/组件库用例”中使用提供和注入有什么危险

在示例代码中:

// parent component providing 'foo'
var Provider = {
  provide: {
    foo: 'bar'
  },
  // ...
}

// child component injecting 'foo'
var Child = {
  inject: ['foo'],
  created () {
    console.log(this.foo) // => "bar"
  }
  // ...
}
据我所知,这样做的好处是,如果您有多个嵌套子组件,您可以跳过向每个嵌套子组件传递道具,而直接在孙子组件中“接收”注入的值

如果您绕过默认的非反应行为“如果您传递一个观察到的对象”,您甚至可以使注入的值成为反应性的,但这里有一个警告对我来说是有意义的,因为您有一个跨嵌套组件的反应性变量,而数据不应该以这种方式传递,因此,如果使用被动对象,跟踪更改可能会变得更加混乱。

根据样式指南:

对于父子组件通信,应该首选道具和事件,而不是。$parent或变种道具

一个理想的Vue应用程序是道具关闭,事件启动。然而,在一些边缘情况下,prop突变或this.$parent可以简化已经深度耦合的两个组件

问题是,在许多简单的情况下,这些模式可能会提供方便。注意:不要为了短期的便利(写更少的代码)而被引诱到交易的简单性(能够理解你所在州的流程)

在这种特殊情况下,您基本上是使用
inject
改变道具。您需要注意的是,在标准应用程序中使用
provide
/
inject
并没有遵循规范方法。如果要将状态映射到组件层次结构,则首选此选项。

根据样式指南:

对于父子组件通信,应该首选道具和事件,而不是。$parent或变种道具

一个理想的Vue应用程序是道具关闭,事件启动。然而,在一些边缘情况下,prop突变或this.$parent可以简化已经深度耦合的两个组件

问题是,在许多简单的情况下,这些模式可能会提供方便。注意:不要为了短期的便利(写更少的代码)而被引诱到交易的简单性(能够理解你所在州的流程)


在这种特殊情况下,您基本上是使用
inject
改变道具。您需要注意的是,在标准应用程序中使用
provide
/
inject
并没有遵循规范方法。如果要将状态映射到组件层次结构,则首选此选项。

谢谢。在这种情况下,Vuex的一个问题是,如果在同一页面上有多个父组件,则从父组件的子组件触发事件会被两个父组件拾取。谢谢。在这种情况下,Vuex的一个问题是,如果在同一页上有多个父组件,则从父组件的子组件触发事件会被两个父组件拾取。