当前位置:首页 > 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-for指令实现,以下是几种常见用法: 基本数组循环 使用v-for指令遍历数组,可以通过(item, index)的语法获取当前项和索引值:…

vue 实现

vue 实现

Vue 实现的基本步骤 安装 Vue.js 可以通过 npm 或 CDN 引入。使用 npm 安装适合大型项目,CDN 适合快速原型开发。 npm install vue 在 HTML 文件中引入…

vue原型实现

vue原型实现

Vue 原型实现的关键点 Vue.js 的原型系统是其响应式机制的核心部分,通过原型链实现数据的动态绑定和依赖收集。以下是实现 Vue 原型的主要技术要点。 数据响应式原理 Vue 通过 Objec…

vue 路由 实现

vue 路由 实现

Vue 路由实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue 路由的详细步骤: 安装 Vue Router 通过 npm 或 ya…

vue实现键盘

vue实现键盘

Vue 实现键盘功能 在Vue中实现键盘功能通常涉及监听键盘事件、处理输入以及渲染虚拟键盘界面。以下是几种常见的实现方式: 监听键盘事件 通过@keydown或@keyup指令监听键盘事件,适用于需…

vue实现复选

vue实现复选

Vue 实现复选框 在 Vue 中实现复选框可以通过 v-model 指令绑定数据,同时结合 input 元素的 type="checkbox" 属性来实现。以下是几种常见的实现方式: 单个复选框…