Skip to content

Tabs 标签页

基于 reka-ui 的 Tabs 原语构建的新粗野主义风格标签页导航组件。支持水平/垂直布局、受控模式和多种激活状态颜色变体。

预览

Preview

水平布局(默认)

在此修改您的账户信息。完成后请点击保存。

垂直布局

通用设置选项,包括语言、主题等基础配置。

数据驱动模式(tabs prop)

概览

安装

pnpm dlx brutx-vue@latest add tabs

用法

vue
<script setup>
import { Tabs, TabsList, TabsTrigger, TabsContent } from 'brutx-ui-vue/tabs'
</script>

<template>
    <Tabs default-value="account">
        <TabsList>
            <TabsTrigger value="account">Account</TabsTrigger>
            <TabsTrigger value="password">Password</TabsTrigger>
        </TabsList>
        <TabsContent value="account">
            <p class="text-sm">Manage your account settings.</p>
        </TabsContent>
        <TabsContent value="password">
            <p class="text-sm">Change your password here.</p>
        </TabsContent>
    </Tabs>
</template>

垂直布局

通过 Tabsorientation 属性设置垂直布局(vertical)。垂直布局下,TabsList 会自动切换为纵向排列(flex-col),适用于侧边栏导航等场景。

orientation 属性会通过依赖注入传递给子组件,因此 TabsList 无需单独设置即可自动适配方向。如需在单个 TabsList 上覆盖方向,可直接设置其 orientation 属性。

vue
<script setup>
import { Tabs, TabsList, TabsTrigger, TabsContent } from 'brutx-ui-vue/tabs'
</script>

<template>
    <Tabs default-value="general" orientation="vertical" class="flex gap-4">
        <TabsList>
            <TabsTrigger value="general">通用</TabsTrigger>
            <TabsTrigger value="security">安全</TabsTrigger>
            <TabsTrigger value="notifications">通知</TabsTrigger>
        </TabsList>
        <TabsContent value="general">
            <p class="text-sm">通用设置选项。</p>
        </TabsContent>
        <TabsContent value="security">
            <p class="text-sm">安全设置选项。</p>
        </TabsContent>
        <TabsContent value="notifications">
            <p class="text-sm">通知设置选项。</p>
        </TabsContent>
    </Tabs>
</template>

受控模式

使用 v-model 实现受控标签页切换:

vue
<script setup>
import { ref } from 'vue'
import { Tabs, TabsList, TabsTrigger, TabsContent } from 'brutx-ui-vue/tabs'

const currentTab = ref('account')
</script>

<template>
    <Tabs v-model="currentTab">
        <TabsList>
            <TabsTrigger value="account">Account</TabsTrigger>
            <TabsTrigger value="password">Password</TabsTrigger>
        </TabsList>
        <TabsContent value="account">
            <p class="text-sm">Manage your account settings.</p>
        </TabsContent>
        <TabsContent value="password">
            <p class="text-sm">Change your password here.</p>
        </TabsContent>
    </Tabs>
</template>

数据驱动模式(tabs prop)

传入 tabs 数组即可让 Tabs 自动渲染 TabsList/TabsTrigger/TabsContent,适用于简单的标签导航场景。未传 tabs 时保持原有 slot 组合用法完全不变。

vue
<script setup>
import { Tabs } from 'brutx-ui-vue/tabs'
import type { TabItem } from 'brutx-ui-vue/tabs'

const tabs: TabItem[] = [
    { label: '概览', value: 'overview' },
    { label: '分析', value: 'analytics' },
    { label: '设置', value: 'settings' },
]
</script>

<template>
    <Tabs :tabs="tabs" model-value="overview" />
</template>

自定义内容面板

通过 #default 插槽可替换默认的 Card 展示。插槽会替代默认内容区域,但 TabsList 仍由 tabs 自动渲染:

vue
<script setup>
import { Tabs, TabsContent } from 'brutx-ui-vue/tabs'
import type { TabItem } from 'brutx-ui-vue/tabs'

const tabs: TabItem[] = [
    { label: 'Tab A', value: 'a' },
    { label: 'Tab B', value: 'b' },
]
</script>

<template>
    <Tabs :tabs="tabs">
        <template #default>
            <TabsContent value="a">
                <p class="text-sm">自定义 A 内容</p>
            </TabsContent>
            <TabsContent value="b">
                <p class="text-sm">自定义 B 内容</p>
            </TabsContent>
        </template>
    </Tabs>
</template>

tabs 模式下额外提供 headerfooter 两个命名插槽,用于在标签区块上下方插入辅助内容。tabs 为空数组时会显示 Result fallback,并仍渲染 header/footer 插槽。

受控/非受控双模式

tabs 模式内置双模式状态管理:

  • 传入 modelValue(或使用 v-model)时为受控模式,由父组件主导激活值
  • 未传 modelValue 时为非受控模式,组件内部维护激活值
  • 当未传 modelValue 且无内部状态时,自动回退到首个 tab 的 value,避免空激活态

变体

TabsTrigger 支持以下激活状态颜色变体:

变体说明
default默认激活状态样式
primaryPrimary(珊瑚色)背景
secondarySecondary 背景
successSuccess(绿色)背景
vue
<template>
    <TabsTrigger value="tab" variant="primary">Primary 变体</TabsTrigger>
</template>

尺寸

TabsList 支持以下容器尺寸:

尺寸说明
sm小尺寸
default默认尺寸
lg大尺寸

子组件

组件说明
Tabs根组件(包装 reka-ui 的 TabsRoot
TabsList标签触发器容器
TabsTrigger可点击的标签按钮
TabsContent每个标签的内容面板

导出类型

brutx-ui-vue/tabs 子路径导入:

ts
import {
    Tabs,
    TabsRoot, // reka-ui 原始组件
    TabsList,
    TabsTrigger,
    TabsContent,
    tabsListVariants,
    tabsTriggerVariants,
    tabsContentVariants,
} from 'brutx-ui-vue/tabs'
import type { TabItem } from 'brutx-ui-vue/tabs'

TabItem

tabs prop 的数据项类型:

ts
interface TabItem {
    label: string
    value: string
}
属性类型说明
labelstring标签显示文本
valuestring标签唯一标识

组合式函数

组件导出了以下变体工具函数,可用于自定义样式扩展:

ts
import {
    tabsListVariants,
    tabsTriggerVariants,
    tabsContentVariants,
} from 'brutx-ui-vue/tabs'
函数变体参数说明
tabsListVariantssize: 'sm' | 'default' | 'lg'orientation: 'horizontal' | 'vertical'容器样式变体
tabsTriggerVariantsvariant: 'default' | 'primary' | 'secondary' | 'success'触发器样式变体
tabsContentVariants内容面板基础样式

Props

Tabs

属性类型默认值说明
modelValuestring当前激活标签页的值(受控模式)
tabsTabItem[]标签数据数组。传入时自动渲染 TabsList/TabsTrigger/TabsContent,未传入时使用默认 slot 组合
orientation'horizontal' | 'vertical''horizontal'标签页排列方向
classstring自定义 CSS 类名。tabs 模式下作用于外层包裹容器

TabsList

属性类型默认值说明
size'sm' | 'default' | 'lg''default'容器尺寸
orientation'horizontal' | 'vertical'继承自 Tabs,默认 'horizontal'排列方向,可覆盖父组件设置
classstring自定义 CSS 类名

TabsTrigger

属性类型默认值说明
valuestring—(必填)标签页唯一标识
disabledbooleanfalse是否禁用
variant'default' | 'primary' | 'secondary' | 'success''default'激活状态颜色变体
classstring自定义 CSS 类名

TabsContent

属性类型默认值说明
valuestring—(必填)对应标签页的值
classstring自定义 CSS 类名

事件

事件参数说明
update:modelValuestring激活标签页变化时触发

可访问性

  • 键盘操作:方向键在标签触发器之间导航
  • ARIA 属性:标签内容通过 ARIA 属性与其触发器关联,激活标签具有 aria-selected="true"

蛮力铸就。