SwSegmented
SwSegmented 是单选选项组(segmented / pill-group):一组 { value, label } 选项平铺全可见,点击或方向键选中一个。受控 v-model,选中变化 emit update:modelValue。
薄壳套 reka-ui 的 RadioGroup,方向键 roving tabindex 无障碍(← → / Home End 在选项间移动并选中)开箱自带。视觉走「最小必要基础样式」——active 态默认主色填充、肉眼可辨,颜色 / 圆角 / 间距由 applier 覆盖。
选型:选项少(2–5 个)、要全部可见、省一次点击时用本组件(筛选 pills / tab / 排序)。选项多、要省横向空间、可接受点开收起时用 SwSelect(下拉)。二者互补。
基础用法
基础单选(排序切换)
<script setup lang="ts">
const sort = ref('hot')
</script>
<template>
<SwSegmented
v-model="sort"
:options="[
{ value: 'hot', label: '最热播' },
{ value: 'new', label: '最新上线' },
{ value: 'rating', label: '评分最高' },
]"
aria-label="排序"
/>
</template>
禁用
支持单项 disabled(禁用列表中某一项)或整组 disabled:
单项禁用 / 整组禁用
自定义选项视觉
#option 插槽全权控制单个选项的内容,作用域暴露 { option, selected, disabled }:
#option 插槽自定义视觉
Props
| 名称 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
modelValue(v-model) | string | number | undefined | 当前选中值(受控)。undefined 为未选 | |
options | SwSegmentedOption[] | ✓ | — | 选项列表,每项 { value, label, disabled? } |
disabled | boolean | false | 整组禁用 |
SwSegmentedOption:{ value: string \| number; label: string; disabled?: boolean }
Events
| 名称 | 携带 | 说明 |
|---|---|---|
update:modelValue | value: string | number | 选中变化,payload 为被选中项的 value |
Slots
| 名称 | 作用域参数 | 说明 |
|---|---|---|
option | { option, selected, disabled } | 自定义单个选项视觉。不传则渲染 option.label |
样式定制 Token
视觉品牌经 --sw-segmented-* token 覆盖(fallback 即默认视觉),无需 :deep 穿透:
| Token | 默认值 | 作用点 |
|---|---|---|
--sw-segmented-gap | 0.25rem | track 内选项间距 |
--sw-segmented-padding | 0.125rem | track 内边距 |
--sw-segmented-bg | var(--muted) | track 底色(灰槽,业界通例形态) |
--sw-segmented-border | transparent | track 描边色(1px 宽度常驻,设色值即得描边 track) |
--sw-segmented-radius | var(--radius) | track 圆角 |
--sw-segmented-min-height | var(--control-height) | track 最小高(表单控件族统一高度) |
--sw-segmented-font-size | var(--control-font-size) | 选项字号 |
--sw-segmented-option-padding | 0.125rem 0.875rem | 选项内边距 |
--sw-segmented-option-radius | calc(var(--radius) - 0.25rem) | 选项圆角 |
--sw-segmented-option-color | var(--muted-foreground) | 未选中文字色 |
--sw-segmented-hover-color | var(--foreground) | 未选中项 hover 文字色(选中项 hover 保持激活色 + filter: brightness(0.92) 变暗) |
--sw-segmented-active-color | var(--primary-foreground) | 激活文字色 |
--sw-segmented-active-bg | var(--primary) | 激活底色 |
--sw-segmented-active-border | transparent | 激活描边(inset box-shadow 实现,零 reflow) |
/* 「tinted 淡底 + 描边」激活形态(替代 :deep 穿透) */
.filter-bar {
--sw-segmented-active-bg: color-mix(in srgb, var(--primary) 12%, transparent);
--sw-segmented-active-color: var(--primary);
--sw-segmented-active-border: var(--primary);
}
高度 / 字号默认吃表单控件族语义 token
--control-height(32px)/--control-font-size(14px)——SwInput / SwSelect / SwSegmented 同行混排默认等高;覆盖这两个 token 全站控件同步缩放,组件级 token 优先级更高。
注意事项
- 无内置视觉品牌:组件只给最小必要基础样式(active 态可辨);颜色 / 圆角 / 间距经上表
--sw-segmented-*token 覆盖,无需:deep穿透选择器。 - 方向键 a11y 自带:← → / Home End 在选项间 roving 移动并选中,无需额外代码。
- 单选专用:本组件只做单选;要下拉收起或多选请用 SwSelect。