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

标签 html vue.js vuejs2

我是 Vue 的初学者,正在边做边学。我能够使复选框可重复使用,但单选按钮的结果有些奇怪。 我在 ProgramDesign.vue 中有数组格式的数据:

data() {
  return {
    strategies: [
      "Not Important",
      "Slightly Important",
      "Moderately Important",
      "Very Important",
      "Extremely Important",
    ],
  };
},

这些是每个问题都会重复的选项。 我像这样为 radio 制作了一个单独的组件:

<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>

这是它在 ProgramDesign.vue 中的使用方式:

<p>first question goes here ?</p>
<RadioButton :groups="strategies" />
<div class="line"></div>
<p>second question goes here ?</p>
<RadioButton :groups="strategies" />

我能够获得可重复使用的输出,但是当我点击第二个问题的单选按钮时,第一个问题的按钮被选中。我该如何解决这个问题?

最佳答案

问题是 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>

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

name 在组(RadioButton 实例)之间也必须是唯一的,因为浏览器创建具有匹配名称的 input 单选组.

解决方案

或者,labelinput 可以通过将 input 放在 label 中来链接,解析id/for 复制(并提高可读性):

<label>
  <input name="strategy" type="radio">
  Not Important
</label>

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

<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>

Edit Troubleshooting label and input pairs

关于html - 如何使具有相同值的单选按钮可重复使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63066293/

相关文章:

javascript - 如何获取字符串文字并将其保存回原始 JSON?

css - Vuetify - 在 v-card 内水平居中 v-progress-线性

validation - 如何在 vuelidate 中动态设置验证字段

javascript - ngclass 在页面加载时自动替换我的 css 设置

html - 为什么当我把 float :right on <div> it goes down?

vue.js - 防止 v-autocomplete 在选择选项时同步搜索

vuejs2 - VueJS : Defining 'data' using object literal vs function returning an object

javascript - 下拉内容显示在侧面

javascript - 单击 href 链接时下载文件?

javascript - 如何使用 Jest 和 vue-cli 更新快照