Skyroc UI
导航

Tabs

用于在同一区域内切换多组内容面板

Tabs 用于在同一上下文中切换不同内容面板。组件基于 Radix Tabs 封装,提供数据驱动的 Tabs 主组件,也导出 Root、List、Trigger、Content 等结构组件用于手动组合。

import {
  Tabs,
  TabsContent,
  TabsList,
  TabsRoot,
  TabsTrigger
} from '@skyroc/web-ui';

何时使用

  • 多组内容属于同一层级,需要在同一空间内切换展示。
  • 选项数量较少,用户需要快速切换内容面板。
  • 需要横向或纵向组织内容导航。
  • 只需要切换一个轻量选项、不展示内容面板时使用 Segment。

基础用法

通过 items 定义 tab 触发项和内容。每个 item 需要唯一 valuelabel 会渲染为触发项,children 会渲染为内容面板。

Preview
Code
Loading...
<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" 切换为纵向布局。纵向布局会让列表和内容横向排列,列表内部触发项垂直排列。

Preview
Code
Loading...
<Tabs
  items={items}
  orientation="vertical"
/>

填充方式

通过 fill 控制根容器的布局伸展方式。auto 让列表按内容宽度展示,full 让根容器按可用空间伸展。

Preview
Code
Loading...
<Tabs
  fill="auto"
  items={items}
/>

形状

通过 shape 控制列表和激活指示器的圆角。

Preview
Code
Loading...
形状说明
square中等圆角,默认样式
rounded胶囊圆角,适合工具栏

尺寸

通过 size 调整字号、间距和触发项尺寸,从 xs2xl 共 6 个尺寸。

Preview
Code
Loading...
尺寸适用场景
xs紧凑面板、表格内
sm小型卡片
md常规场景(默认)
lg设置页
xl大号内容区
2xl大屏或触控场景

样式类型

通过 type="line" 使用线性 tab 样式。默认 pill 类型使用背景块和滑动指示器。

Preview
Code
Loading...
<Tabs
  items={items}
  type="line"
/>

自定义渲染

使用 renderTriggerrenderContent 可以自定义触发项和内容。回调会收到 active 和当前 item

Preview
Code
Loading...
<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是否显示滑动指示器booleantrue
disabled是否禁用全部触发项boolean-
forceMountContent是否强制挂载所有内容面板true-
loop键盘导航是否循环boolean-
dir文本方向'ltr' | 'rtl'-
className根容器 classClassValue-
classNames各 slot 的自定义 classTabsUi-
listProps传递给 TabsList 的额外 propsTabsListProps-
triggerProps传递给每个 TabsTrigger 的额外 propsPartial<TabsTriggerProps>-
contentProps传递给每个 TabsContent 的额外 propsTabsContentProps-
renderTrigger自定义触发项渲染(props: { active: boolean; item: TabsOptionData }) => ReactNode-
renderContent自定义内容面板渲染(props: { active: boolean; item: TabsOptionData }) => ReactNode-

结构组件

需要完全控制 DOM 结构时,可以使用结构组件手动组合。

属性说明类型默认值
TabsRoot根容器,基于 Radix Tabs RootTabsRootProps-
TabsList触发项列表,负责滑动指示器定位TabsListProps-
TabsTrigger单个触发项TabsTriggerProps-
TabsContent单个内容面板TabsContentProps-

类型

TabsProps

Tabs 主组件属性。组合 Root、List、Trigger 和 Content,并支持数据驱动渲染。

字段类型说明
itemsTabsOptionData[]Tab 数据项。
valuestring受控选中值。
defaultValuestring默认选中值。
onValueChange(value: string) => void选中值变化回调。
orientation'horizontal' | 'vertical'布局方向。
fill'auto' | 'full'根容器填充方式。
shape'square' | 'rounded'列表和指示器形状。
type'pill' | 'line'样式类型。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'组件尺寸。
enableIndicatorboolean是否显示滑动指示器。
disabledboolean是否禁用全部触发项。
forceMountContenttrue是否强制挂载内容面板。
loopboolean键盘导航是否循环。
dir'ltr' | 'rtl'文本方向。
classNameClassValue根容器 class。
classNamesTabsUislot class 配置。
listPropsTabsListProps列表属性。
triggerPropsPartial<TabsTriggerProps>触发项属性。
contentPropsTabsContentProps内容面板属性。
renderTrigger(props: { active: boolean; item: TabsOptionData }) => ReactNode触发项渲染函数。
renderContent(props: { active: boolean; item: TabsOptionData }) => ReactNode内容渲染函数。

TabsOptionData

单个 tab 数据项。

字段类型说明
valuestringtab 唯一值。
labelReactNode触发项显示内容。
childrenReactNode内容面板内容。
disabledboolean是否禁用当前触发项。

TabsUi

Tabs 各 slot 的自定义 class。

字段类型说明
rootClassValue根容器 class。
listClassValue触发项列表 class。
triggerClassValue触发项 class。
contentClassValue内容面板 class。
indicatorRootClassValue指示器定位容器 class。
indicatorClassValue指示器元素 class。

TabsRootProps

根容器属性,基于 Radix Tabs Root,并增加项目 fill 样式变体。

字段类型说明
valuestring受控选中值。
defaultValuestring默认选中值。
onValueChange(value: string) => void选中值变化回调。
orientation'horizontal' | 'vertical'布局方向。
dir'ltr' | 'rtl'文本方向。
activationMode'automatic' | 'manual'键盘聚焦时的激活模式。
fill'auto' | 'full'根容器填充方式。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'根容器尺寸。
classNameClassValue根容器 class。

TabsListProps

触发项列表属性,基于 Radix Tabs List,并增加指示器和样式变体。

字段类型说明
childrenReactNode触发项。
valuestring当前选中值,用于定位指示器。
loopboolean键盘导航是否循环。
orientation'horizontal' | 'vertical'布局方向。
shape'square' | 'rounded'列表形状。
type'pill' | 'line'样式类型。
enableIndicatorboolean是否显示滑动指示器。
classNameClassValue列表 class。
classNamesPick<TabsUi, 'indicator' | 'indicatorRoot'>指示器相关 slot class。

TabsTriggerProps

触发项属性,基于 Radix Tabs Trigger,并增加样式变体。

字段类型说明
valuestring触发项对应值。
childrenReactNode触发项内容。
disabledboolean是否禁用触发项。
enableIndicatorboolean是否配合滑动指示器渲染。
type'pill' | 'line'样式类型。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'触发项尺寸。
classNameClassValue触发项 class。

TabsContentProps

内容面板属性,基于 Radix Tabs Content,并增加方向和尺寸样式。

字段类型说明
valuestring内容面板对应值。
childrenReactNode内容。
forceMounttrue是否强制挂载。
orientation'horizontal' | 'vertical'布局方向。
size'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'内容面板尺寸。
classNameClassValue内容面板 class。

IndicatorStyle

TabsList 内部用于计算滑动指示器位置和尺寸的状态。

字段类型说明
positionnumber | null指示器起始位置。
sizenumber | null指示器尺寸。

ClassValue

CSS 类名类型

string | null | undefined | Record<string, boolean> | ClassValue[]

On this page