Tabs
用于在同一区域内切换多组内容面板
Tabs 用于在同一上下文中切换不同内容面板。组件基于 Radix Tabs 封装,提供数据驱动的 Tabs 主组件,也导出 Root、List、Trigger、Content 等结构组件用于手动组合。
import {
Tabs,
TabsContent,
TabsList,
TabsRoot,
TabsTrigger
} from '@skyroc/web-ui';何时使用
- 多组内容属于同一层级,需要在同一空间内切换展示。
- 选项数量较少,用户需要快速切换内容面板。
- 需要横向或纵向组织内容导航。
- 只需要切换一个轻量选项、不展示内容面板时使用 Segment。
基础用法
通过 items 定义 tab 触发项和内容。每个 item 需要唯一 value,label 会渲染为触发项,children 会渲染为内容面板。
<Tabs
defaultValue="tab-1"
items={[
{ value: 'tab-1', label: 'Tab 1', children: 'Content 1' },
{ value: 'tab-2', label: 'Tab 2', children: 'Content 2' }
]}
/>纵向布局
通过 orientation="vertical" 切换为纵向布局。纵向布局会让列表和内容横向排列,列表内部触发项垂直排列。
<Tabs
items={items}
orientation="vertical"
/>填充方式
通过 fill 控制根容器的布局伸展方式。auto 让列表按内容宽度展示,full 让根容器按可用空间伸展。
<Tabs
fill="auto"
items={items}
/>形状
通过 shape 控制列表和激活指示器的圆角。
| 形状 | 说明 |
|---|---|
square | 中等圆角,默认样式 |
rounded | 胶囊圆角,适合工具栏 |
尺寸
通过 size 调整字号、间距和触发项尺寸,从 xs 到 2xl 共 6 个尺寸。
| 尺寸 | 适用场景 |
|---|---|
xs | 紧凑面板、表格内 |
sm | 小型卡片 |
md | 常规场景(默认) |
lg | 设置页 |
xl | 大号内容区 |
2xl | 大屏或触控场景 |
样式类型
通过 type="line" 使用线性 tab 样式。默认 pill 类型使用背景块和滑动指示器。
<Tabs
items={items}
type="line"
/>自定义渲染
使用 renderTrigger 和 renderContent 可以自定义触发项和内容。回调会收到 active 和当前 item。
<Tabs
items={items}
renderTrigger={({ active, item }) => (
<span>{item.label}{active ? ' *' : ''}</span>
)}
renderContent={({ item }) => item.children}
/>API
Tabs
主组件基于 Radix Tabs Root,使用 items 自动渲染 TabsList、TabsTrigger 和 TabsContent。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| items* | Tabs 数据项 | TabsOptionData[] | - |
| value | 受控模式下当前选中的 tab 值 | string | - |
| defaultValue | 非受控模式下默认选中的 tab 值 | string | - |
| onValueChange | 选中 tab 变化时触发 | (value: string) => void | - |
| orientation | 布局方向 | 'horizontal' | 'vertical' | 'horizontal' |
| fill | 根容器填充方式 | 'auto' | 'full' | 'auto' |
| shape | 列表和指示器形状 | 'square' | 'rounded' | 'square' |
| type | 样式类型 | 'pill' | 'line' | 'pill' |
| size | 尺寸,影响字号、间距和触发项大小 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' |
| enableIndicator | 是否显示滑动指示器 | boolean | true |
| disabled | 是否禁用全部触发项 | boolean | - |
| forceMountContent | 是否强制挂载所有内容面板 | true | - |
| loop | 键盘导航是否循环 | boolean | - |
| dir | 文本方向 | 'ltr' | 'rtl' | - |
| className | 根容器 class | ClassValue | - |
| classNames | 各 slot 的自定义 class | TabsUi | - |
| listProps | 传递给 TabsList 的额外 props | TabsListProps | - |
| triggerProps | 传递给每个 TabsTrigger 的额外 props | Partial<TabsTriggerProps> | - |
| contentProps | 传递给每个 TabsContent 的额外 props | TabsContentProps | - |
| renderTrigger | 自定义触发项渲染 | (props: { active: boolean; item: TabsOptionData }) => ReactNode | - |
| renderContent | 自定义内容面板渲染 | (props: { active: boolean; item: TabsOptionData }) => ReactNode | - |
结构组件
需要完全控制 DOM 结构时,可以使用结构组件手动组合。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| TabsRoot | 根容器,基于 Radix Tabs Root | TabsRootProps | - |
| TabsList | 触发项列表,负责滑动指示器定位 | TabsListProps | - |
| TabsTrigger | 单个触发项 | TabsTriggerProps | - |
| TabsContent | 单个内容面板 | TabsContentProps | - |
类型
TabsProps
Tabs 主组件属性。组合 Root、List、Trigger 和 Content,并支持数据驱动渲染。
| 字段 | 类型 | 说明 |
|---|---|---|
| items | TabsOptionData[] | Tab 数据项。 |
| value | string | 受控选中值。 |
| defaultValue | string | 默认选中值。 |
| onValueChange | (value: string) => void | 选中值变化回调。 |
| orientation | 'horizontal' | 'vertical' | 布局方向。 |
| fill | 'auto' | 'full' | 根容器填充方式。 |
| shape | 'square' | 'rounded' | 列表和指示器形状。 |
| type | 'pill' | 'line' | 样式类型。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 组件尺寸。 |
| enableIndicator | boolean | 是否显示滑动指示器。 |
| disabled | boolean | 是否禁用全部触发项。 |
| forceMountContent | true | 是否强制挂载内容面板。 |
| loop | boolean | 键盘导航是否循环。 |
| dir | 'ltr' | 'rtl' | 文本方向。 |
| className | ClassValue | 根容器 class。 |
| classNames | TabsUi | slot class 配置。 |
| listProps | TabsListProps | 列表属性。 |
| triggerProps | Partial<TabsTriggerProps> | 触发项属性。 |
| contentProps | TabsContentProps | 内容面板属性。 |
| renderTrigger | (props: { active: boolean; item: TabsOptionData }) => ReactNode | 触发项渲染函数。 |
| renderContent | (props: { active: boolean; item: TabsOptionData }) => ReactNode | 内容渲染函数。 |
TabsOptionData
单个 tab 数据项。
| 字段 | 类型 | 说明 |
|---|---|---|
| value | string | tab 唯一值。 |
| label | ReactNode | 触发项显示内容。 |
| children | ReactNode | 内容面板内容。 |
| disabled | boolean | 是否禁用当前触发项。 |
TabsUi
Tabs 各 slot 的自定义 class。
| 字段 | 类型 | 说明 |
|---|---|---|
| root | ClassValue | 根容器 class。 |
| list | ClassValue | 触发项列表 class。 |
| trigger | ClassValue | 触发项 class。 |
| content | ClassValue | 内容面板 class。 |
| indicatorRoot | ClassValue | 指示器定位容器 class。 |
| indicator | ClassValue | 指示器元素 class。 |
TabsRootProps
根容器属性,基于 Radix Tabs Root,并增加项目 fill 样式变体。
| 字段 | 类型 | 说明 |
|---|---|---|
| value | string | 受控选中值。 |
| defaultValue | string | 默认选中值。 |
| onValueChange | (value: string) => void | 选中值变化回调。 |
| orientation | 'horizontal' | 'vertical' | 布局方向。 |
| dir | 'ltr' | 'rtl' | 文本方向。 |
| activationMode | 'automatic' | 'manual' | 键盘聚焦时的激活模式。 |
| fill | 'auto' | 'full' | 根容器填充方式。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 根容器尺寸。 |
| className | ClassValue | 根容器 class。 |
TabsListProps
触发项列表属性,基于 Radix Tabs List,并增加指示器和样式变体。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 触发项。 |
| value | string | 当前选中值,用于定位指示器。 |
| loop | boolean | 键盘导航是否循环。 |
| orientation | 'horizontal' | 'vertical' | 布局方向。 |
| shape | 'square' | 'rounded' | 列表形状。 |
| type | 'pill' | 'line' | 样式类型。 |
| enableIndicator | boolean | 是否显示滑动指示器。 |
| className | ClassValue | 列表 class。 |
| classNames | Pick<TabsUi, 'indicator' | 'indicatorRoot'> | 指示器相关 slot class。 |
TabsTriggerProps
触发项属性,基于 Radix Tabs Trigger,并增加样式变体。
| 字段 | 类型 | 说明 |
|---|---|---|
| value | string | 触发项对应值。 |
| children | ReactNode | 触发项内容。 |
| disabled | boolean | 是否禁用触发项。 |
| enableIndicator | boolean | 是否配合滑动指示器渲染。 |
| type | 'pill' | 'line' | 样式类型。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 触发项尺寸。 |
| className | ClassValue | 触发项 class。 |
TabsContentProps
内容面板属性,基于 Radix Tabs Content,并增加方向和尺寸样式。
| 字段 | 类型 | 说明 |
|---|---|---|
| value | string | 内容面板对应值。 |
| children | ReactNode | 内容。 |
| forceMount | true | 是否强制挂载。 |
| orientation | 'horizontal' | 'vertical' | 布局方向。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 内容面板尺寸。 |
| className | ClassValue | 内容面板 class。 |
IndicatorStyle
TabsList 内部用于计算滑动指示器位置和尺寸的状态。
| 字段 | 类型 | 说明 |
|---|---|---|
| position | number | null | 指示器起始位置。 |
| size | number | null | 指示器尺寸。 |