当前位置:首页 > VUE

vue radio组件实现

2026-03-08 03:02:33VUE

Vue Radio 组件实现方法

基础实现

使用 v-model 绑定单选按钮的值,确保同一组 radio 的 name 属性相同:

<template>
  <div>
    <input type="radio" id="option1" value="1" v-model="selected" name="group" />
    <label for="option1">Option 1</label>
    <input type="radio" id="option2" value="2" v-model="selected" name="group" />
    <label for="option2">Option 2</label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selected: ''
    }
  }
}
</script>

动态渲染选项

通过 v-for 动态生成 radio 选项:

<template>
  <div v-for="option in options" :key="option.value">
    <input 
      type="radio" 
      :id="option.value" 
      :value="option.value" 
      v-model="selected" 
      name="dynamicGroup" 
    />
    <label :for="option.value">{{ option.label }}</label>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selected: '',
      options: [
        { value: 'a', label: 'Alpha' },
        { value: 'b', label: 'Beta' }
      ]
    }
  }
}
</script>

组件化封装

创建可复用的 Radio 组件:

<!-- RadioGroup.vue -->
<template>
  <div class="radio-group">
    <div 
      v-for="option in options" 
      :key="option.value" 
      class="radio-option"
      @click="selectOption(option.value)"
    >
      <input 
        type="radio" 
        :id="`${name}-${option.value}`" 
        :value="option.value" 
        v-model="modelValue" 
        :name="name" 
      />
      <label :for="`${name}-${option.value}`">{{ option.label }}</label>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    options: Array,
    modelValue: [String, Number],
    name: String
  },
  methods: {
    selectOption(value) {
      this.$emit('update:modelValue', value)
    }
  }
}
</script>

<style scoped>
.radio-option {
  cursor: pointer;
  margin: 5px 0;
}
</style>

使用自定义组件

在父组件中使用封装好的 Radio 组件:

<template>
  <RadioGroup 
    v-model="selectedFruit" 
    :options="fruitOptions" 
    name="fruitSelection"
  />
</template>

<script>
import RadioGroup from './RadioGroup.vue'

export default {
  components: { RadioGroup },
  data() {
    return {
      selectedFruit: '',
      fruitOptions: [
        { value: 'apple', label: 'Apple' },
        { value: 'banana', label: 'Banana' }
      ]
    }
  }
}
</script>

样式优化技巧

使用 CSS 隐藏原生 radio 并自定义样式:

<template>
  <div class="custom-radio">
    <input 
      type="radio" 
      :id="id" 
      :value="value" 
      v-model="modelValue" 
      class="radio-input"
    />
    <label :for="id" class="radio-label">
      <span class="radio-custom"></span>
      {{ label }}
    </label>
  </div>
</template>

<style scoped>
.radio-input {
  position: absolute;
  opacity: 0;
}

.radio-label {
  display: flex;
  align-items: center;
  cursor: pointer;
}

.radio-custom {
  width: 20px;
  height: 20px;
  border: 2px solid #ddd;
  border-radius: 50%;
  margin-right: 10px;
  position: relative;
}

.radio-input:checked + .radio-label .radio-custom {
  border-color: #42b983;
}

.radio-input:checked + .radio-label .radio-custom::after {
  content: '';
  position: absolute;
  width: 12px;
  height: 12px;
  background: #42b983;
  border-radius: 50%;
  top: 2px;
  left: 2px;
}
</style>

表单验证集成

结合 Vuelidate 进行表单验证:

vue radio组件实现

<template>
  <div>
    <div v-for="option in options" :key="option.value">
      <input
        type="radio"
        :id="option.value"
        :value="option.value"
        v-model="selected"
        @blur="$v.selected.$touch()"
      />
      <label :for="option.value">{{ option.label }}</label>
    </div>
    <span v-if="$v.selected.$error" class="error">必须选择一个选项</span>
  </div>
</template>

<script>
import { required } from 'vuelidate/lib/validators'

export default {
  data() {
    return {
      selected: '',
      options: [
        { value: 'yes', label: 'Yes' },
        { value: 'no', label: 'No' }
      ]
    }
  },
  validations: {
    selected: { required }
  }
}
</script>

标签: 组件vue
分享给朋友:

相关文章

vue 实现关闭

vue 实现关闭

Vue 实现关闭功能的方法 在Vue中实现关闭功能通常涉及组件销毁、模态框隐藏或路由跳转等场景。以下是几种常见实现方式: 销毁当前组件 使用v-if或v-show控制组件显示/隐藏,适用于局部组件:…

vue watch实现

vue watch实现

在 Vue 中实现 watch 监听数据变化 Vue 的 watch 选项用于监听数据变化并执行相应的回调函数。以下是几种常见的实现方式: 基础用法 export default { data(…

vue 实现 confirm

vue 实现 confirm

实现确认对话框的方法 在Vue中实现确认对话框可以通过多种方式完成,包括使用内置组件、第三方库或自定义组件。 使用浏览器原生confirm 最简单的实现方式是直接调用浏览器原生的confirm方法。…

vue实现多线程

vue实现多线程

Vue.js 本身是单线程框架,但可以通过以下方法实现类似多线程的效果或利用浏览器多线程能力: 使用 Web Worker Web Worker 是浏览器提供的多线程 API,适合处理 CPU 密集…

vue实现选择框

vue实现选择框

Vue 实现选择框的方法 Vue 中可以通过多种方式实现选择框(下拉框),包括原生 HTML 的 <select> 元素结合 Vue 的数据绑定,或者使用第三方 UI 库如 Element…

vue实现树目录

vue实现树目录

Vue 实现树形目录 在 Vue 中实现树形目录可以通过递归组件或第三方库(如 element-ui 的 el-tree)完成。以下是两种常见实现方式: 递归组件实现 递归组件适合自定义程度高的树形…