【问题标题】:VueJS Binding same variable to multiple of the same componentVueJS将相同的变量绑定到多个相同的组件
【发布时间】:2017-08-14 17:25:02
【问题描述】:

假设我有一个带有 VueJS 的基本页面,如下所示:

Vue.component('child', {
  template: '<p>{{message}}</p>',
  props: ["message"]
});

new Vue({
  el: '#theParent',
  data() {
    return {
      message: "It works!"
    }
  }
});
<script src="https://cdn.jsdelivr.net/vue/2.3.2/vue.min.js"></script>
<div id="theParent">
    <child v-bind:message="message"></child>
    <child v-bind:message="message"></child>
    <child v-bind:message="message"></child>
</div>

It works! 消息按预期显示了 3 次,但如果我在我的 &lt;child&gt; 组件上删除 v-bind:message="message",它就不起作用。由于我所有的&lt;child&gt; 组件都需要来自父级的message 的值,有没有办法在VueJS 组件声明中指定一次,而不是每次在HTML 中添加&lt;child&gt; 时指定?

【问题讨论】:

  • 不。您必须明确声明子组件将从父组件接收的道具。 VueJS 中没有隐式继承。
  • 没有办法在某个地方而不是每次都这样做吗?如果我有几十个&lt;child&gt; 组件,那么每次都指定它真的很麻烦......
  • 子组件的数量是由列表驱动的吗?
  • 如果您有很多本质上是迭代的子组件,您可能需要考虑使用v-for
  • @Bert 不,不是。这是我的实际问题的简化示例(在我的实际问题中,&lt;child&gt; 组件中有内容,因此它们是唯一的)。

标签: javascript html vue.js vuejs2


【解决方案1】:

一种方法是使用共享数据源。

console.clear()

const shared = {
  message: "It works!"
}

Vue.component('child', {
  template: '<p>{{shared.message}}</p>',
  data(){
    return {
      shared
    }
  }
});

new Vue({
  el: '#theParent',
  data:{
    shared
  }
});
<script src="https://cdn.jsdelivr.net/vue/2.3.2/vue.min.js"></script>
<div id="theParent">
    <child></child>
    <child></child>
    <child></child>
    <button @click="shared.message = 'new message'">Change message</button>
</div>

在这里,只要message 发生变化,它就随处可用。这本质上是一个非常纤薄的数据管理解决方案。对于更完整的状态管理解决方案,您可能需要查看 Vuex,但您可以使用相对简单的共享数据源并在您发现需要时添加更复杂的解决方案。

【讨论】:

  • 这看起来是一个很好的解决方案 - 我的印象是在 data() 之外定义的对象可能不是反应性的,并且更改可能不会立即反映在 UI 中......但看起来我是错误的。谢谢!
  • @abagshaw 没问题 ;) 这里的区别是当shared被添加到数据时,它被转换成一个反应对象。如果 Vue 和组件都只是使用了 shared 而没有将它添加到 data 并且没有做任何其他事情来使 shared 具有反应性,那么它就不会是反应性的。
猜你喜欢
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
相关资源
最近更新 更多