如何使具有相同值的单选按钮可重用?

Bis*_*was 3 html vue.js vuejs2

我是 Vue 的初学者,并通过实践来学习。我能够使复选框可重复使用,但对单选按钮产生了一些奇怪的结果。我有数组格式的数据ProgramDesign.vue

data() {
  return {
    strategies: [
      "Not Important",
      "Slightly Important",
      "Moderately Important",
      "Very Important",
      "Extremely Important",
    ],
  };
},
Run Code Online (Sandbox Code Playgroud)

这些是在每个问题上重复出现的选项。我为收音机制作了一个单独的组件,如下所示:

<template>
  <div>
    <span v-for="strategy in groups" :key="strategy">
      <input :id="strategy" class="radio-style" name="strategy" type="radio" />
      <label :for="strategy" class="radio-style-3-label">{{strategy}}</label>
    </span>
  </div>
</template>
<script>
export default {
  props: {
    groups: Array,
  },
};
</script>
Run Code Online (Sandbox Code Playgroud)

这是它的使用方式ProgramDesign.vue

<p>first question goes here ?</p>
<RadioButton :groups="strategies" />
<div class="line"></div>
<p>second question goes here ?</p>
<RadioButton :groups="strategies" />
Run Code Online (Sandbox Code Playgroud)

我能够获得可重用的输出,但是当我单击第二个问题的单选按钮时,第一个问题的按钮被选中。我怎样才能解决这个问题?

ton*_*y19 5

问题是input组件实例之间的ID 和名称不是唯一的,这可以在两个RadioButton组件的渲染中看到(为简洁起见进行了简化):

<!-- RadioButton 1 -->
<div>
  <span>
    <input id="Not Important" name="strategy" type="radio">
    <label for="Not Important">Not Important</label>
  </span>
</div>

<!-- RadioButton 2 -->
<div>
  <span>
    <input id="Not Important"? name="strategy"? type="radio">
    <label for="Not Important">Not Important</label>
  </span>
</div>
Run Code Online (Sandbox Code Playgroud)

每个labelinput通过匹配forid属性链接到,这样单击label会导致链接的无线电input更改值。当有多个input具有相同标识符的 s 时,浏览器会将 链接label到第一个匹配的input,从而导致您观察到的行为。

name还必须是群体(间独特的RadioButton情况下),因为浏览器创建的单选按钮组input具有匹配名称秒。

解决方案

或者, a labelandinput可以通过将 放在input里面来链接label,解决id/for重复(并提高可读性):

<label>
  <input name="strategy" type="radio">
  Not Important
</label>
Run Code Online (Sandbox Code Playgroud)

解决重复names 的一种方法是将名称基于每个实例递增的计数器:

<template>
  <div>
    <label v-for="strategy in groups" :key="strategy">
      <input :name="'strategy' + groupId" type="radio">
      {{strategy}}
    </label>
  </div>
</template>

<script>
let groupId = 0

export default {
  props: {
    groups: Array
  },
  data() {
    return {
      groupId: groupId++
    }
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)

编辑故障排除标签和输入对

  • 谢谢你@tony19。这是我能收到的最好答案。让我更清楚地了解“标签”和“输入”之间的联系,并且效果很好。 (3认同)