Switch
Switch 从 HeroUI v2 到 v3 的迁移指南。
完整的 API 参考、样式指南与高级示例请参阅 v3 Switch 文档。本指南只关注从 HeroUI v2 的迁移。
结构变化
在 v2 中,Switch 结构简单,children 作为标签:
import { Switch } from "@lenso/ui";
export default function App() { return <Switch>Enable notifications</Switch>;}在 v3 中,Switch 需要复合组件:
import { Switch, Label } from "@lenso/ui";
export default function App() { return ( <Switch> <Switch.Content> <Switch.Control> <Switch.Thumb /> </Switch.Control> Enable notifications </Switch.Content> </Switch> );}主要变化
1. 组件结构
v2: children 作为标签的简单 Switch
v3: 复合组件(Switch.Content、Switch.Control、Switch.Thumb)与 Label 组件
2. Prop 变更
| v2 prop | v3 位置 | 说明 |
|---|---|---|
onValueChange | onChange | 事件处理函数已重命名 |
size | size | 仍在根上(sm | md | lg) |
label | — | 请使用 Label 组件 |
color | — | 已移除(请使用 Tailwind CSS) |
thumbIcon | — | 请在 Switch.Thumb 内使用 Switch.Icon |
startContent | — | 请直接自定义控件 |
endContent | — | 请直接自定义控件 |
classNames | — | 请在各子组件上使用 className |
disableAnimation | — | 已移除(动画机制已不同) |
3. 新组件
SwitchGroup— 用于将多个 Switch 成组Switch.Content— 可点击的标签,包裹控件与LabelSwitch.Icon— 拇指(Thumb)内的图标
迁移示例
受控 Switch
import { useState } from "react";
const [isSelected, setIsSelected] = useState(true);
<Switch isSelected={isSelected} onValueChange={setIsSelected}> Airplane mode</Switch>无标签
<Switch defaultSelected aria-label="Automatic updates" />带拇指图标
<Switch thumbIcon={<CheckIcon />}>Enable notifications</Switch>带起始 / 结束内容
<Switch startContent={<SunIcon />} endContent={<MoonIcon />}> Dark mode</Switch>带标签与描述
<Switch description="You will receive notifications for all activity"> Enable notifications</Switch>尺寸与颜色
{/* Sizes */}<div className="flex gap-4"> <Switch size="sm">Small</Switch> <Switch size="md">Medium</Switch> <Switch size="lg">Large</Switch></div>
{/* Colors */}<Switch color="primary">Primary</Switch><Switch color="success">Success</Switch><Switch color="danger">Danger</Switch>Switch 组
{/* No built-in group component in v2 */}<div className="flex flex-col gap-2"> <Switch name="notifications">Allow Notifications</Switch> <Switch name="marketing">Marketing emails</Switch></div>组件组成
v3 Switch 的结构如下:
Switch (Root) ├── Switch.Content (the clickable label) │ ├── Switch.Control │ │ └── Switch.Thumb │ │ └── Switch.Icon (optional) │ └── Label ├── Description (optional, sibling) └── FieldError (optional, sibling)分组时:
SwitchGroup ├── Switch │ ├── Switch.Content │ │ ├── Switch.Control │ │ │ └── Switch.Thumb │ │ └── Label │ └── Description (optional) └── Switch ├── Switch.Content │ ├── Switch.Control │ │ └── Switch.Thumb │ └── Label └── Description (optional)说明
事件处理函数
- v2:
onValueChangeprop - v3:
onChangeprop(签名相同:(isSelected: boolean) => void)
标签
- v2: children 作为标签
- v3:
Label放在Switch.Content(可点击的标签)内;Description/FieldError作为Switch.Content的同级元素
图标
- v2:
thumbIcon用于拇指内图标,startContent/endContent用于外侧图标 - v3: 拇指内图标用
Switch.Icon(置于Switch.Thumb内);起始 / 结束内容请自定义Switch.Control
总结
- 组件结构:必须使用复合组件(
Switch.Content、Switch.Control、Switch.Thumb) - 可点击的标签:用
Switch.Content包裹Switch.Control与Label;将Description/FieldError作为Switch.Content的同级元素 - 标签:不再用 children 作为标签 — 请在
Switch.Content内使用Label - 事件处理函数:
onValueChange→onChange - 样式相关 prop 已移除:
color— 请使用 Tailwind CSS - 图标相关 prop 已移除:
thumbIcon、startContent、endContent— 请用子组件或直接自定义 classNames已移除:请在各子组件上使用classNameprop- 新组件:
SwitchGroup用于成组;Switch.Content作为可点击的标签,包裹控件与Label