Segmented (default)
Underline
import { Tabs } from "@cloudflare/kumo";
export function TabsDefaultDemo() {
return (
<div className="flex flex-col items-start gap-6">
<div>
<p className="mb-2 text-sm text-kumo-subtle">Segmented (default)</p>
<Tabs
variant="segmented"
tabs={[
{ value: "tab1", label: "Tab 1" },
{ value: "tab2", label: "Tab 2" },
{ value: "tab3", label: "Tab 3" },
]}
selectedValue="tab1"
/>
</div>
<div>
<p className="mb-2 text-sm text-kumo-subtle">Underline</p>
<Tabs
variant="underline"
tabs={[
{ value: "tab1", label: "Tab 1" },
{ value: "tab2", label: "Tab 2" },
{ value: "tab3", label: "Tab 3" },
]}
selectedValue="tab1"
/>
</div>
</div>
);
}安装
桶式导出
import { Tabs } from "@cloudflare/kumo";细粒度导入
import { Tabs } from "@cloudflare/kumo/components/tabs";用法
import { Tabs } from "@cloudflare/kumo";
export default function Example() {
return (
<Tabs
tabs={[
{ value: "overview", label: "Overview" },
{ value: "settings", label: "Settings" },
]}
selectedValue="overview"
/>
);
}示例
变体
分段式(默认)
胶囊形状的指示器在浅色背景上于选项卡之间滑动。
import { Tabs } from "@cloudflare/kumo";
export function TabsSegmentedDemo() {
return (
<Tabs
variant="segmented"
tabs={[
{ value: "tab1", label: "Tab 1" },
{ value: "tab2", label: "Tab 2" },
{ value: "tab3", label: "Tab 3" },
]}
selectedValue="tab1"
/>
);
}下划线
底部边框配主色指示器。当前激活的选项卡 文字更粗,以示强调。
import { Tabs } from "@cloudflare/kumo";
export function TabsUnderlineDemo() {
return (
<Tabs
variant="underline"
tabs={[
{ value: "tab1", label: "Tab 1" },
{ value: "tab2", label: "Tab 2" },
{ value: "tab3", label: "Tab 3" },
]}
selectedValue="tab1"
/>
);
}小尺寸
使用 size="sm" 得到紧凑的选项卡栏,与 Input size="sm" 高度一致(h-6.5 / 26px)。
适合放在工具栏和筛选行中。
Segmented sm
Underline sm
import { Tabs } from "@cloudflare/kumo";
export function TabsSmDemo() {
return (
<div className="flex flex-col items-start gap-6">
<div>
<p className="mb-2 text-sm text-kumo-subtle">Segmented sm</p>
<Tabs
variant="segmented"
size="sm"
tabs={[
{ value: "tab1", label: "Tab 1" },
{ value: "tab2", label: "Tab 2" },
{ value: "tab3", label: "Tab 3" },
]}
selectedValue="tab1"
/>
</div>
<div>
<p className="mb-2 text-sm text-kumo-subtle">Underline sm</p>
<Tabs
variant="underline"
size="sm"
tabs={[
{ value: "tab1", label: "Tab 1" },
{ value: "tab2", label: "Tab 2" },
{ value: "tab3", label: "Tab 3" },
]}
selectedValue="tab1"
/>
</div>
</div>
);
}受控模式
使用 value 和 onValueChange 属性实现受控状态。
Active tab: tab1
import { useState } from "react";
import { Tabs } from "@cloudflare/kumo";
export function TabsControlledDemo() {
const [activeTab, setActiveTab] = useState("tab1");
return (
<div className="space-y-4">
<Tabs
tabs={[
{ value: "tab1", label: "Tab 1" },
{ value: "tab2", label: "Tab 2" },
{ value: "tab3", label: "Tab 3" },
]}
value={activeTab}
onValueChange={setActiveTab}
/>
<p className="text-sm text-kumo-subtle">
Active tab: <code className="text-sm">{activeTab}</code>
</p>
</div>
);
}多选项卡
项目较多时,Tabs 会自动进行水平滚动。
import { Tabs } from "@cloudflare/kumo";
export function TabsManyDemo() {
return (
<div className="w-full max-w-md">
<Tabs
tabs={[
{ value: "overview", label: "Overview" },
{ value: "analytics", label: "Analytics" },
{ value: "reports", label: "Reports" },
{ value: "notifications", label: "Notifications" },
{ value: "settings", label: "Settings" },
{ value: "billing", label: "Billing" },
{ value: "security", label: "Security" },
{ value: "integrations", label: "Integrations" },
]}
selectedValue="overview"
/>
</div>
);
}水平溢出
当分段式选项卡溢出容器时,被裁剪的边缘会出现滚动按钮。可以使用 这些按钮、水平滚动或鼠标拖拽来 显示屏幕外的选项卡。
import { Tabs } from "@cloudflare/kumo";
export function TabsOverflowDemo() {
return (
<div className="w-full max-w-xs">
<Tabs
tabs={[
{ value: "overview", label: "Overview" },
{ value: "analytics", label: "Analytics" },
{ value: "reports", label: "Reports" },
{ value: "notifications", label: "Notifications" },
{ value: "settings", label: "Settings" },
{ value: "billing", label: "Billing" },
{ value: "security", label: "Security" },
{ value: "integrations", label: "Integrations" },
]}
selectedValue="overview"
/>
</div>
);
}动态选项卡数量
这个示例在溢出的选项卡集与类似生产环境的七选项卡集之间切换。当多余 选项卡消失后,剩余选项卡可以容纳时, 末尾的溢出控件应自动隐藏。
10 tabs
import { useState } from "react";
import { Tabs } from "@cloudflare/kumo";
export function TabsDynamicCountDemo() {
const [showExtraTabs, setShowExtraTabs] = useState(true);
const tabs = showExtraTabs
? [...productionLikeTabs, ...productionLikeExtraTabs]
: productionLikeTabs;
return (
<div className="space-y-3">
<div className="w-full max-w-[588px]">
<Tabs tabs={tabs} selectedValue="settings" />
</div>
<div className="flex items-center gap-3 text-sm text-kumo-subtle">
<button
type="button"
className="rounded-md border border-kumo-line bg-kumo-base px-2.5 py-1 text-kumo-default hover:bg-kumo-tint focus:ring-2 focus:ring-kumo-brand focus:outline-none"
onClick={() => setShowExtraTabs((current) => !current)}
>
Toggle extra tabs
</button>
<span>{showExtraTabs ? "10 tabs" : "7 tabs"}</span>
</div>
</div>
);
}API 参考
| Prop | Type | Default | Description |
|---|---|---|---|
| tabs | TabsItem[] | - | 要渲染的选项卡项数组。 |
| value | string | - | 受控值。设置后,组件变为受控。 |
| selectedValue | string | - | 非受控模式下的默认选中值。当设置了 |
| activateOnFocus | boolean | - | 当 |
| className | string | - | 根元素的额外 CSS 类。 |
| listClassName | string | - | 标签列表元素的额外 CSS 类。 |
| indicatorClassName | string | - | 指示器元素的额外 CSS 类。 |
| labels | TabsLabels | - | 用于 aria-labels 国际化的标签。所有标签都有英文默认值。 |
| variant | "segmented" | "underline" | "segmented" | 选项卡样式。
|
| size | "base" | "sm" | "base" | 选项卡大小。
|
| onValueChange | (value: string) => void | - | 活动标签页变化时的回调 |
TabsItem
| 属性 | 类型 | 是否必需 |
|---|---|---|
| value | string | Yes |
| label | ReactNode | Yes |
| className | string | No |
| render | TabsTab.Props[“render”] | No |
| nativeButton | boolean | No |