v0.1.9

Segmented 分段控制器

引入import { Segmented } from '@apollo-design/ui';

用于展示多个选项并允许用户选择其中单个选项。

引入

import { Segmented } from '@apollo-design/ui';

代码演示

加载中…

基本用法 #

最简单的用法。

窄画布下保留横向选项,可横向滚动;聚焦后用方向键选择,当前选项会滚动到可见区域。

加载中…

受控模式 #

通过 v-model:value 受控。

加载中…

占满整行 #

block 属性使其适配父元素宽度。

加载中…

禁用 #

disabled 支持「整组禁用」与「单项禁用」两种粒度。

加载中…

动态选项 #

options 动态变化时选中值与 thumb 自动跟随。

窄画布下保留横向选项,可横向滚动;聚焦后用方向键选择,当前选项会滚动到可见区域。

加载中…

纯图标 #

只给 icon 不给 label 的选项。

加载中…

带图标 #

icon 与 label 同时使用;第三方库的裸 <svg> 也能对齐(样式层 -item-icon > svg)。

加载中…

自定义渲染 + tooltip #

自定义渲染选项内容,并支持为选项配置 tooltip 提示(tooltip 支持 string | TooltipProps)。

加载中…

圆形 #

shape="round" 时根与选项全圆角。

加载中…

三种大小 #

small / middle(默认)/ large。

加载中…

纵向布局 #

vertical 时 thumb 沿纵轴移动。

加载中…

指定 name #

内部 radio input 的 name;未传时自动生成。

加载中…

语义化 styles #

classNames / styles 支持对象与函数式。

加载中…

组件级 Token #

通过 ConfigProvider 的 theme.components.Segmented 覆盖。

窄画布下保留横向选项,可横向滚动;聚焦后用方向键选择,当前选项会滚动到可见区域。

加载中…

受控同步 #

两个 Segmented 共享同一个受控值:选择任意一个,另一个会同步更新。

加载中…

统一高度 #

Segmented 与同尺寸的 Button 并排时高度保持一致,可用于表单工具栏等需要对齐的场景。

API

通用属性参考:通用属性。

SegmentedProps

参数 说明 类型 默认值 版本
block 值块占满整行 boolean false
disabled 是否禁用 boolean false
options 数据化配置选项 SegmentedOptions []
shape 形状 'default' | 'round' 'default'
size 控件尺寸 'small' | 'middle' | 'medium' | 'large' 'middle'
value 当前值(受控) SegmentedValue -
defaultValue 初始值;未传时选中第一个选项 SegmentedValue -
name 内部 radio input 的 name string 自动生成
vertical 纵向布局(旧 API) boolean false
orientation 布局方向(新 API) 'horizontal' | 'vertical' -
prefixCls 类名前缀 string -
classNames 语义化类名(支持函数式) { root, icon, label, item } -
styles 语义化样式(支持函数式) { root, icon, label, item } -

事件

事件名 说明 回调参数
update:value 选中值变化(配合 v-model:value) (value: SegmentedValue) => void
change 请求选中值变化 (value: SegmentedValue) => void
keydown 原生键盘事件;先于内部导航,可调用 preventDefault() (event: KeyboardEvent) => void

change 与 update:value 是 Vue 所属事件;模板使用 @change / v-model:value,h() 使用 onChange / onUpdate:value,不再手动调用 attrs 中的监听器。

受控时仅提议更新,父级拒绝后恢复原生 radio 的实际勾选;撤控保留最后接受的值。defaultValue 只初始化一次,未提供时在首批选项到达后取第一项。后续重排或删除不静默改变选择;受控值不在选项中时保持该值且无项目勾选。

原生 class、完整 style(对象、字符串、数组)、id、ARIA/data 与监听器落到实际根 div,native style 的优先级高于语义根样式。根本身不增加默认 Tab 停靠点,当前可用 radio(未命中时为首个可用项)是唯一 Tab 入口。方向键跳过禁用项并环绕;水平 RTL 反转左右方向,原生取消和输入法期间不导航。只有父级接受更新才移动键盘焦点。

ConfigProvider 的当前禁用、尺寸、方向及 components.segmented 语义配置响应更新与撤回,组件 disabled=false 可显式覆盖全局禁用。

SegmentedValue

type SegmentedValue = string | number;

SegmentedOptions

type SegmentedOption = SegmentedValue | SegmentedLabeledOption;
type SegmentedOptions = readonly SegmentedOption[];

interface SegmentedLabeledOptionWithoutIcon {
  value: SegmentedValue;
  label: VNodeChild; // 完整 Vue 内容,包括数组和 Fragment
  disabled?: boolean;
  title?: string;
  className?: string;
  id?: string;
  tooltip?: string | TooltipProps;
}

interface SegmentedLabeledOptionWithIcon {
  value: SegmentedValue;
  icon: VNodeChild;
  label?: VNodeChild;
  disabled?: boolean;
  title?: string;
  tooltip?: string | TooltipProps;
}

内容通过选项数据提供,label / icon 接受完整 VNodeChild(含 0、数组和 Fragment),不接受未消费的渲染回调。id 落到对应 label;原生 radio 的 value 是选项值的字符串形式,事件保留原始 string/number 类型。图标选项无文本时以 title 或选项值提供原生访问名称,建议填写有意义的 title。

Ref

interface SegmentedRef {
  nativeElement: HTMLDivElement | null;
}

主题变量

Token 说明 默认值
itemColor 选项文本颜色 colorTextLabel
itemHoverColor 选项悬浮态文本颜色 colorText
itemHoverBg 选项悬浮态背景色 colorFillSecondary
itemActiveBg 选项激活态背景色 colorFill
itemSelectedBg 选项选中背景色 colorBgElevated
itemSelectedColor 选项选中文字色 colorText
trackPadding 控件容器 padding lineWidthBold
trackBg 控件容器背景色 colorBgLayout

trackPadding 支持数字(px)或 CSS 长度字符串;其余七项接受 CSS 字符串。通过 theme.components.Segmented 覆盖的八项均在实际根生效,并响应替换与移除。

Powered by Vue 3 + ViteApollo Design · Vue NativeGitHub