---
title: Segmented 分段控制器
description: 在一组互斥选项中切换,滑块跟随选中项移动
---
# Segmented 分段控制器
分段控制器把 2-5 个互斥选项并排展示,用一个会滑动的滑块指示当前选项。它比 [Tabs](/ui/data/tabs) 轻量:切换的是**同一区域的视图模式**,不是内容面板。
## 何时使用
- 视图模式切换:列表 / 看板 / 时间线;
- 粒度切换:日 / 周 / 月;
- 表单里的少量选项(2-5 项)时,比 [Select](/ui/form/select) 更快、比 [Radio](/ui/form/radio) 更紧凑;
- 选项超过 5 个、或需要多选时,请改用 Select / Checkbox。
## 基础用法
`options` 可以直接传原始值数组,选中值通过 `v-model` 双向绑定(支持字符串、数字、布尔)。
## 对象选项
选项写成对象可以自定义显示文字、加图标、单独禁用某一项。
## 圆角形状
## 纵向排列
`vertical` 时滑块上下移动,适合做侧边栏的视图切换。
## 撑满宽度
`block` 让各项等分父容器宽度(纵向时为高度),常用于移动端或表单顶部。
## 自定义每项内容
`#label` 插槽作用域为 `{ option, index, checked }`:`option` 是原始选项对象,`checked` 表示该项是否选中。
## 非受控用法
不传 `modelValue` 时组件内部维护选中值(默认不选中),通过 `change` 把结果抛给业务。
## API
### Props
| 名称 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `modelValue` | `string \| number \| boolean` | — | 双向绑定的选中值。不传即非受控 |
| `options` | `Array` | `[]` | 选项数据源,元素可以是原始值或 `{ label, value, disabled, icon }` |
| `shape` | `'default' \| 'round'` | `'default'` | 圆角形状。`round` 为全圆角胶囊 |
| `vertical` | `boolean` | `false` | 纵向排列,滑块上下移动 |
| `block` | `boolean` | `false` | 撑满父容器并等分各项 |
| `disabled` | `boolean` | `false` | 禁用整组 |
| `name` | `string` | 自动生成 | 原生 radio 组名。不传时用 `useId` 生成,避免多组互斥冲突 |
### Events
| 名称 | 参数 | 说明 |
| --- | --- | --- |
| `update:modelValue` | `(value: string \| number \| boolean)` | 选中项变化时触发(受控与非受控都会触发) |
| `change` | `(value: string \| number \| boolean)` | 同上,便于只监听变化 |
### Slots
| 名称 | 参数 | 说明 |
| --- | --- | --- |
| `label` | `{ option: SegmentedOptionInput, index: number, checked: boolean }` | 自定义每项内容;不传时渲染 `icon` + `label` |
### 类型定义
```ts
export type SegmentedValue = string | number | boolean
export interface SegmentedOption {
label?: string
value: SegmentedValue
disabled?: boolean
icon?: Component | VNode
}
export type SegmentedOptionInput = SegmentedValue | SegmentedOption
export type SegmentedShape = 'default' | 'round'
```
### 样式变量
| 变量 | 默认值 | 说明 |
| --- | --- | --- |
| `--g3-segmented-padding` | `2px` | 轨道内边距 |
| `--g3-radius` | `6px` | 轨道圆角(`round` 时为全圆角) |
| `--g3-fill` | `rgba(0,0,0,.04)` | 轨道底色 |
| `--g3-bg-container` | `#fff` | 滑块底色 |
| `--g3-shadow` | `0 2px 8px rgba(0,0,0,.15)` | 滑块投影 |
## 实现说明
- 底层是**原生 radio 组**(`input[type=radio]` + `