Skip to content

Radio 单选框

用于在一组互斥选项中选择一个结果,适合状态切换、筛选条件、配置项选择。

何时使用

  • 多个选项互斥,且用户必须或通常只选择一个。
  • 选项数量较少,需要直接展示全部选项。
  • 需要用按钮样式表达更强的分段控制感。

基础用法

当前:a
vue
<template>
  <x-radio-group v-model="value" name="basic-radio">
    <x-radio value="a">选项 A</x-radio>
    <x-radio value="b">选项 B</x-radio>
  </x-radio-group>
</template>

<script setup lang="ts">
import { ref } from 'vue';

const value = ref('a');
</script>

选项配置

vue
<template>
  <x-radio-group v-model="value" :options="options" name="time-radio" />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const value = ref('day');
const options = [
  { label: '今日', value: 'day' },
  { label: '本周', value: 'week' },
  { label: '本月', value: 'month' },
];
</script>

禁用状态

vue
<template>
  <x-radio-group v-model="value" :options="options" />
  <x-radio-group v-model="value" :options="options" disabled />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const value = ref('enabled');
const options = [
  { label: '启用', value: 'enabled' },
  { label: '禁用项', value: 'disabled', disabled: true },
  { label: '归档', value: 'archived' },
];
</script>

按钮样式

vue
<template>
  <x-radio-group v-model="value" type="button" :options="options" />
</template>

尺寸

vue
<template>
  <x-radio-group v-model="value" type="button" size="mini" :options="options" />
  <x-radio-group v-model="value" type="button" size="small" :options="options" />
  <x-radio-group v-model="value" type="button" size="medium" :options="options" />
  <x-radio-group v-model="value" type="button" size="large" :options="options" />
</template>

纵向排列

vue
<template>
  <x-radio-group v-model="value" direction="vertical" :options="options" />
</template>

自定义文案

vue
<template>
  <x-radio-group v-model="value" :options="options">
    <template #label="{ data }">
      <span>{{ data.label }}角色</span>
    </template>
  </x-radio-group>
</template>

自定义单选框图形

vue
<template>
  <x-radio-group v-model="value" :options="options">
    <template #radio="{ checked, disabled }">
      <span :class="{ 'is-checked': checked, 'is-disabled': disabled }" />
    </template>
  </x-radio-group>
</template>

布尔值选项

vue
<template>
  <x-radio-group v-model="value" :options="options" />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const value = ref(true);
const options = [
  { label: '启用', value: true },
  { label: '停用', value: false },
];
</script>

事件

vue
<template>
  <x-radio-group v-model="value" :options="options" @change="handleChange" />
</template>

<script setup lang="ts">
import { ref } from 'vue';

const value = ref('read');
const handleChange = (value: string | number | boolean) => {
  console.log(value);
};
</script>

按需导入

ts
import { Radio, RadioGroup } from 'x-next';

Radio Props

参数说明类型默认值
modelValue绑定值RadioValueundefined
defaultChecked默认是否选中,非受控模式booleanfalse
value选项值RadioValuetrue
type单选类型'radio' | 'button''radio'
disabled是否禁用booleanfalse
name原生 input 的 name 属性,优先级高于 RadioGroup 的 namestring-
id原生 input 的 id 属性string-

Radio Events

事件名说明回调参数
update:modelValue值更新时触发value: RadioValue
change值变化时触发value: RadioValue, event: Event

Radio Slots

插槽名说明参数
default单选框文案-
radio自定义单选框图形{ checked, disabled }

RadioGroup Props

参数说明类型默认值
modelValue绑定值RadioValueundefined
defaultValue默认值,非受控模式RadioValue''
type单选组类型'radio' | 'button''radio'
size单选组尺寸'mini' | 'small' | 'medium' | 'large'跟随全局配置
options选项数据Array<RadioValue | RadioOption>-
direction排列方向'horizontal' | 'vertical''horizontal'
disabled是否禁用booleanfalse
name传给组内原生 input 的 name 属性string-
ariaLabel原生 radiogroup 的 aria-label 属性string-

RadioGroup Events

事件名说明回调参数
update:modelValue值更新时触发value: RadioValue
change值变化时触发value: RadioValue, event: Event

RadioGroup Slots

插槽名说明参数
default自定义单选框列表-
label自定义 options 文案{ data }
radio自定义单选框图形{ checked, disabled }

类型

ts
type RadioValue = string | number | boolean;

interface RadioOption {
  label?: string | (() => VNode);
  value: RadioValue;
  disabled?: boolean;
}