导航
Segment
用于在少量互斥选项之间切换的分段控制器
Segment 用于在同一上下文中切换少量互斥选项。组件基于 Tabs 的结构和样式能力封装,只渲染触发项,不渲染内容面板,适合视图模式、时间范围、筛选维度等轻量选择场景。
import { Segment } from '@skyroc/web-ui';何时使用
- 选项数量较少,用户需要直接看到全部可选项。
- 选项之间互斥,切换后通常影响同一区域的展示方式或过滤条件。
- 需要比 Radio 更紧凑、更像工具栏的选择控件。
- 需要展示独立内容面板时使用 Tabs;需要表单语义更明确的单选项时使用 Radio。
基础用法
通过 items 定义选项,使用 value 和 onValueChange 可以实现受控模式,也可以使用 defaultValue 作为非受控默认值。
Preview
Code
Loading...
<Segment
defaultValue="day"
items={[
{ value: 'day', label: 'Day' },
{ value: 'week', label: 'Week' }
]}
/>方向
通过 orientation 控制排列方向。默认横向排列,纵向排列适合侧栏筛选、设置面板或窄容器。
Preview
Code
Loading...
<Segment
items={items}
orientation="vertical"
/>形状
通过 shape 控制外层容器和激活指示器的圆角。
Preview
Code
Loading...
| 形状 | 说明 |
|---|---|
square | 中等圆角,默认样式 |
rounded | 胶囊圆角,适合工具栏 |
尺寸
通过 size 调整字号、间距和触发项尺寸,从 xs 到 2xl 共 6 个尺寸。
Preview
Code
Loading...
| 尺寸 | 适用场景 |
|---|---|
xs | 表格、紧凑工具栏 |
sm | 小型筛选区 |
md | 常规场景(默认) |
lg | 设置页或表单区域 |
xl | 强调型切换控件 |
2xl | 大尺寸展示或触控区 |
样式类型
通过 type 切换分段样式。pill 是默认填充式样式,line 使用线性指示器。设置 enableIndicator={false} 时,组件会使用触发项自身的激活背景。
Preview
Code
Loading...
<Segment
items={items}
type="line"
/>
<Segment
enableIndicator={false}
items={items}
/>禁用
可以禁用整个 Segment,也可以在单个 item 上设置 disabled 禁用部分选项。
Preview
Code
Loading...
<Segment
items={[
{ value: 'day', label: 'Day' },
{ value: 'week', label: 'Week', disabled: true }
]}
/>
<Segment disabled items={items} />API
Segment
通用属性参考:Segment 复用 Tabs Root、List 和 Trigger 的交互能力,但不会渲染内容面板。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| items* | 分段选项数据 | SegmentOptionData[] | - |
| value | 受控模式下当前选中的值 | string | - |
| defaultValue | 非受控模式下默认选中的值 | string | - |
| onValueChange | 选中值变化时触发 | (value: string) => void | - |
| orientation | 排列方向 | 'horizontal' | 'vertical' | 'horizontal' |
| shape | 圆角形状 | 'square' | 'rounded' | 'square' |
| size | 尺寸,影响字号、间距和触发项大小 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' |
| type | 样式类型 | 'pill' | 'line' | 'pill' |
| fill | 根容器填充方式 | 'auto' | 'full' | 'auto' |
| enableIndicator | 是否显示滑动指示器 | boolean | true |
| disabled | 是否禁用全部选项 | boolean | - |
| loop | 键盘导航是否循环 | boolean | - |
| dir | 文本方向,透传给 Radix Tabs Root/List | 'ltr' | 'rtl' | - |
| className | 根容器 class | ClassValue | - |
| classNames | 各 slot 的自定义 class | TabsUi | - |
| listProps | 传递给内部 TabsList 的额外 props | TabsListProps | - |
| triggerProps | 传递给每个内部 TabsTrigger 的额外 props | Partial<TabsTriggerProps> | - |
类型
SegmentProps
Segment 主组件属性。基于 TabsProps 收窄,移除了内容面板相关能力。
| 字段 | 类型 | 说明 |
|---|---|---|
| items | SegmentOptionData[] | 分段选项列表。 |
| value | string | 受控选中值。 |
| defaultValue | string | 默认选中值。 |
| onValueChange | (value: string) => void | 选中值变化回调。 |
| orientation | 'horizontal' | 'vertical' | 排列方向。 |
| shape | 'square' | 'rounded' | 圆角形状。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 尺寸。 |
| type | 'pill' | 'line' | 样式类型。 |
| fill | 'auto' | 'full' | 根容器填充方式。 |
| enableIndicator | boolean | 是否显示滑动指示器。 |
| disabled | boolean | 是否禁用全部选项。 |
| loop | boolean | 键盘导航是否循环。 |
| dir | 'ltr' | 'rtl' | 文本方向。 |
| className | ClassValue | 根容器 class。 |
| classNames | TabsUi | slot class 配置。 |
| listProps | TabsListProps | 内部列表属性。 |
| triggerProps | Partial<TabsTriggerProps> | 内部触发项属性。 |
SegmentOptionData
单个分段选项的数据结构。
| 字段 | 类型 | 说明 |
|---|---|---|
| value | string | 选项唯一值。 |
| label | ReactNode | 选项显示内容。 |
| disabled | boolean | 是否禁用当前选项。 |
TabsUi
Segment 复用 Tabs 的 slot class 配置。
| 字段 | 类型 | 说明 |
|---|---|---|
| root | ClassValue | 根容器 class。 |
| list | ClassValue | 选项列表 class。 |
| trigger | ClassValue | 触发项 class。 |
| indicatorRoot | ClassValue | 指示器定位容器 class。 |
| indicator | ClassValue | 指示器元素 class。 |
TabsListProps
内部列表属性,基于 Radix Tabs List,并增加项目样式变体。
| 字段 | 类型 | 说明 |
|---|---|---|
| className | ClassValue | 列表 class。 |
| classNames | Pick<TabsUi, 'indicator' | 'indicatorRoot'> | 指示器相关 slot class。 |
| enableIndicator | boolean | 是否显示滑动指示器。 |
| orientation | 'horizontal' | 'vertical' | 排列方向。 |
| shape | 'square' | 'rounded' | 圆角形状。 |
| type | 'pill' | 'line' | 样式类型。 |
| value | string | 当前选中值。 |
TabsTriggerProps
内部触发项属性,基于 Radix Tabs Trigger,并增加项目样式变体。
| 字段 | 类型 | 说明 |
|---|---|---|
| value | string | 触发项对应值。 |
| disabled | boolean | 是否禁用触发项。 |
| className | ClassValue | 触发项 class。 |
| enableIndicator | boolean | 是否配合滑动指示器渲染。 |
| type | 'pill' | 'line' | 样式类型。 |