Radiobutton-like 个行为 Vue.js 个组件

Radiobutton-like behaving Vue.js components

我有以下 Vue.js 组件,它们基本上应该具有 radiobutton-like 行为:

// Parent Component
<template>
  <child-component
    v-for="element in elements"
  </child-component>
</template>

<script>
import ChildComponent from './Child.vue'

export default {
  components: {
    ChildComponent
  },
  props: {
    elements: Array
  },
  methods: {
    activate(e) {
      for (let i of this.$children) {
        i.active = false;
      }

      if (e < this.$children.length) {
        this.$children[e].active = true;
      }
    }
  }
}
</script>

// Child Component
<template>
  {{active}}
</template>

<script>
export default {
  props: {
    active: Boolean
  }
}
</script>

这很好用,但只有 parent 可以决定激活其中一个 children(从而停用所有其他)。

但是我也希望能够允许每个 child 激活自身(并且通过其 parent 的魔法 属性,停用所有其他兄弟姐妹)。

显然我不希望每个 child 都知道它的兄弟姐妹并弄乱他们的 .active 道具(超级糟糕的设计)。

我宁愿不让 children 与 parent 通信并调用一些方法(仍然是糟糕的设计,因为我只能在 parent 有 activate() 方法)。

相反,我希望 parent 监听所有 children active 道具的变化,并在其中一个道具发生变化时采取行动。这样 parent 就完全封装了单选按钮的行为。

如何在 Vue.js 中实现这种交互?

看看 two-way 绑定:http://vuejs.org/guide/components.html#Prop_Binding_Types

这允许您在两个方向上同步 属性 的值,这意味着 parent 或 child 有权更改变量。然后你可以在 parent 上观察变化并相应地更新。

我认为更好的选择是创建一个 RadioSet 组件,然后在该组件中放置多个单选按钮。这将消除您对 parent 必须具有 activate() 方法的担忧。您可以简单地传入一个 object 和一系列 idvalues 来生成按钮。