u
This commit is contained in:
1 parent
f572dce2f6
commit
e99a9fb274
356 files changed
+28877
-1055
No files matched your search
@@ -0,0 +1,106 @@
|
||||
---
|
||||
title: Radio 单选框
|
||||
description: 与 RadioGroup 组合使用,在一组选项里选中一个
|
||||
---
|
||||
|
||||
# Radio 单选框
|
||||
|
||||
`G3Radio` 必须放在 `G3RadioGroup` 里才能互斥。组负责值、禁用与 `name`,单选项只声明自己的 `value` 和内容。
|
||||
|
||||
## 何时使用
|
||||
|
||||
- 选项少(2-5 个)且需要**一次看全**时,比 [Select](/ui/form/select) 更快;
|
||||
- 选项是互斥的、必须选一个时使用;可以不选时用 Select 更合适;
|
||||
- 选项超过 5 个、或需要展示更多信息时,用 Select;
|
||||
- 只是控制某个功能的开与关,用 [Switch](/ui/form/switch)。
|
||||
|
||||
## 基础用法
|
||||
|
||||
:::demo{name="radio/basic"}
|
||||
:::
|
||||
|
||||
组会自动生成唯一的原生 `name`(`useId`),因此同页多组之间不会互相干扰,键盘方向键也能在组内来回切换。
|
||||
|
||||
## 纵向排列与整组禁用
|
||||
|
||||
组默认是水平换行的 `inline-flex`;纵向排列用外部 `style` 改 `flex-direction`,或给组包一层纵向容器。
|
||||
|
||||
:::demo{name="radio/vertical"}
|
||||
:::
|
||||
|
||||
## 卡片式选择
|
||||
|
||||
默认插槽可以放任意内容,配合 `style` 就能做成卡片选择器(常见于套餐、模板选择)。
|
||||
|
||||
:::demo{name="radio/cards"}
|
||||
:::
|
||||
|
||||
## API
|
||||
|
||||
### Props(Radio)
|
||||
|
||||
| 名称 | 类型 | 默认值 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| `value` | `string \| number \| boolean` | **必填** | 选项值。与组 `modelValue` 做 `Object.is` 比较决定是否选中 |
|
||||
| `disabled` | `boolean` | `false` | 单独禁用该项(组禁用时以组为准) |
|
||||
|
||||
### Props(RadioGroup)
|
||||
|
||||
| 名称 | 类型 | 默认值 | 说明 |
|
||||
| --- | --- | --- | --- |
|
||||
| `modelValue` | `string \| number \| boolean` | — | 双向绑定的选中值 |
|
||||
| `disabled` | `boolean` | `false` | 禁用整组 |
|
||||
| `name` | `string` | 自动生成 | 原生 radio 组名,不传时用 `useId` 生成 |
|
||||
|
||||
### Events(RadioGroup)
|
||||
|
||||
| 名称 | 参数 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `update:modelValue` | `(value: string \| number \| boolean)` | 选中项变化 |
|
||||
| `change` | `(value: string \| number \| boolean)` | 同上,便于只监听变化 |
|
||||
|
||||
### Slots
|
||||
|
||||
| 组件 | 插槽 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| Radio | `default` | 选项文案,可放富内容 |
|
||||
| RadioGroup | `default` | 组内的 `G3Radio` 列表 |
|
||||
|
||||
### 类型定义
|
||||
|
||||
```ts
|
||||
export type RadioValue = string | number | boolean
|
||||
|
||||
export interface RadioProps {
|
||||
value: RadioValue
|
||||
disabled?: boolean
|
||||
}
|
||||
|
||||
export interface RadioGroupProps {
|
||||
modelValue?: RadioValue
|
||||
disabled?: boolean
|
||||
name?: string
|
||||
}
|
||||
|
||||
export interface RadioGroupContext {
|
||||
name: ComputedRef<string | undefined>
|
||||
modelValue: ComputedRef<RadioValue | undefined>
|
||||
disabled: ComputedRef<boolean>
|
||||
select: (value: RadioValue) => void
|
||||
}
|
||||
```
|
||||
|
||||
### 样式变量
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| `--g3-radio-size` | `16px` | 圆圈直径 |
|
||||
| `--g3-color-primary` | `#18181b` | 选中态边框与内点 |
|
||||
| `--g3-bg-disabled` / `--g3-text-disabled` | `rgba(0,0,0,.04 / .25)` | 禁用态 |
|
||||
|
||||
## 实现说明
|
||||
|
||||
- 底层同样是原生 `input[type=radio]`:组用 `<div>` 包裹、每项用 `<label>` 包裹,浏览器原生提供「组内互斥 + 方向键切换」;
|
||||
- 选中判断用 `Object.is`(而不是 `===`),这样 `NaN` 之类的值也能正确比较;
|
||||
- 组上下文通过 `provide` 下发:`{ name, modelValue, disabled, select }`,单选项目通过 `inject` 读取;**脱离组单独使用时**会退化为「永不选中」的原生 radio(不会报错,但也不会有选中态),因此务必成对使用;
|
||||
- 未显式传 `name` 时用 `useId` 生成组名,避免同页多个 radio 组因为浏览器按 `name` 分组而互相影响。
|
||||
Reference in new issue
Block a user