apps/docs/content/docs/cn/react/migration/(components)/button.mdx
在 v2 中,Button 通过 color 与 variant 组合使用:
import { Button } from "@heroui/react";
export default function App() {
return <Button color="primary" variant="solid">Button</Button>;
}
在 v3 中,Button 仅使用 variant prop(不再有独立的 color prop):
import { Button } from "@heroui/react";
export default function App() {
return <Button variant="primary">Button</Button>;
}
v2: 使用 color + variant 组合
v3: 仅使用 variant(无独立 color prop)
| v2 color + variant | v3 变体 | 说明 |
|---|---|---|
color="primary" variant="solid" | variant="primary" | 默认主按钮 |
color="default" variant="solid" | variant="primary" | 使用 primary 变体 |
color="secondary" variant="solid" | variant="secondary" | 相同 |
color="success" variant="solid" | variant="primary" | 如需可配合自定义样式使用 primary |
color="warning" variant="solid" | variant="primary" | 如需可配合自定义样式使用 primary |
color="danger" variant="solid" | variant="danger" | 提供 danger 变体 |
color="primary" variant="bordered" | variant="secondary" | 外观相近 |
color="primary" variant="light" | variant="tertiary" | 外观相近 |
color="primary" variant="flat" | variant="tertiary" | 外观相近 |
color="primary" variant="faded" | variant="secondary" | 外观相近 |
color="primary" variant="ghost" | variant="ghost" | 相同 |
color="danger" variant="flat" | variant="danger-soft" | 新增柔和危险变体 |
v2 变体: solid、bordered、light、flat、faded、shadow、ghost
v3 变体: primary、secondary、tertiary、outline、ghost、danger、danger-soft
isLoading → isPendingv2: 使用 isLoading prop
v3: 使用 isPending prop
v2: 按钮按尺寸带有最小宽度(sm:min-w-16,md:min-w-20,lg:min-w-24)
v3: 按钮默认使用 w-fit(宽度随内容,无最小宽度)
因此当文案较短时,v3 按钮会比 v2 更窄。若要保留 v2 的最小宽度行为,请添加 Tailwind 类,请见下方 尺寸与最小宽度 示例小节。
| v2 prop | v3 位置 | 说明 |
|---|---|---|
isLoading | Button | 已重命名为 isPending |
isIconOnly | Button | v3 仍支持 — 渲染仅含图标的方形按钮 |
color | — | 已移除(由变体负责样式) |
radius | — | 已移除(请使用 Tailwind,例如 rounded-lg) |
startContent, endContent | — | 请将图标作为 children 放置 |
spinner, spinnerPlacement | — | 请通过渲染 prop 自行处理加载态 |
disableRipple | — | 已移除(v3 已移除波纹) |
disableAnimation | — | 已移除(动画由内部处理) |
classNames | — | 请使用 className |
v2: 提供独立的 ButtonGroup 组件
v3: ButtonGroup 仍然存在。详见 ButtonGroup 迁移指南。
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx <Button color="primary" variant="solid">Solid</Button> <Button color="primary" variant="bordered">Bordered</Button> <Button color="primary" variant="ghost">Ghost</Button>
</Tab>
<Tab value="v3">
tsx <Button variant="primary">Primary</Button> <Button variant="secondary">Secondary</Button> <Button variant="ghost">Ghost</Button>
</Tab>
</Tabs>
danger-soft 变体为 v3 新增,用于替代 v2 中 color="danger" variant="flat" 的用法。
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx <Button color="danger" variant="flat">Delete</Button>
</Tab>
<Tab value="v3">
tsx <Button variant="danger-soft">Delete</Button>
</Tab>
</Tabs>
isIconOnly)isIconOnly prop 在 v2 与 v3 中均可用,用于渲染适配单个图标的方形按钮。v3 中请用 variant 替代 color 控制样式。
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx <Button isIconOnly color="danger" variant="flat"> <HeartIcon /> </Button> <Button isIconOnly color="primary" variant="bordered" size="sm"> <SearchIcon /> </Button>
</Tab>
<Tab value="v3">
```tsx
import { Icon } from "@iconify/react";
<Button isIconOnly variant="danger-soft">
<Icon icon="gravity-ui:heart" />
</Button>
<Button isIconOnly variant="secondary" size="sm">
<Icon icon="gravity-ui:magnifier" />
</Button>
```
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx <Button isLoading color="primary"> Loading </Button> <Button isLoading={isLoading} spinnerPlacement="start" color="primary" onPress={() => setIsLoading(true)} > Upload File </Button>
</Tab>
<Tab value="v3">
```tsx
import { useState } from "react";
import { Spinner } from "@heroui/react";
import { Icon } from "@iconify/react";
const [isLoading, setIsLoading] = useState(false);
<Button isPending={isLoading}>
{({isPending}) => (
<>
{isPending && <Spinner color="current" size="sm" />}
Loading
</>
)}
</Button>
<Button
isPending={isLoading}
onPress={() => setIsLoading(true)}
>
{({isPending}) => (
<>
{isPending ? (
<Spinner color="current" size="sm" />
) : (
<Icon icon="gravity-ui:paperclip" />
)}
{isPending ? "Uploading..." : "Upload File"}
</>
)}
</Button>
```
<Tabs items={["v2", "v3"]}> <Tab value="v2"> ```tsx import { Icon } from "@iconify/react";
<Button
color="success"
endContent={<Icon icon="gravity-ui:camera" />}
>
Take a photo
</Button>
<Button
color="danger"
startContent={<Icon icon="gravity-ui:trash-bin" />}
variant="bordered"
>
Delete user
</Button>
```
<Button variant="primary">
<Icon icon="gravity-ui:camera" />
Take a photo
</Button>
<Button variant="secondary">
<Icon icon="gravity-ui:trash-bin" />
Delete user
</Button>
```
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx <Button isIconOnly color="danger"> <HeartIcon /> </Button>
</Tab>
<Tab value="v3">
```tsx
import { Icon } from "@iconify/react";
<Button isIconOnly variant="danger">
<Icon icon="gravity-ui:heart" />
</Button>
```
<Tabs items={["v2", "v3"]}> <Tab value="v2"> ```tsx import { Button, ButtonGroup } from "@heroui/react";
<ButtonGroup size="sm" color="primary" variant="solid">
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
```
<ButtonGroup size="sm" variant="primary">
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
```
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx <Button size="md" color="primary">Save</Button>
</Tab>
<Tab value="v3">
tsx <Button size="md" variant="primary" className="min-w-20"> Save </Button>
</Tab>
</Tabs>
v3 Button 支持渲染 prop 模式,可拿到状态信息:
<Button isPending={isLoading}>
{({isPending, isPressed, isHovered, isFocused, isFocusVisible, isDisabled}) => (
<>
{isPending && <Spinner size="sm" />}
{isPressed ? "Pressed!" : "Click me"}
</>
)}
</Button>
可用的渲染 prop:
isPending — 是否处于加载状态isPressed — 是否正被按下isHovered — 是否悬停isFocused — 是否聚焦isFocusVisible — 是否应显示焦点环isDisabled — 是否禁用color prop 已移除:请用 variant 替代 color + variant 组合primary、secondary、tertiary、outline、ghost、danger、danger-soft)danger-soft 变体:v3 新增,替代 v2 的 color="danger" variant="flat"isLoading → isPending:加载相关 prop 已重命名isIconOnly:v3 仍支持 — 用于仅图标的方形按钮w-fit,不再内置最小宽度 — 可添加 min-w-* 贴近 v2startContent / endContent 已移除 — 请将图标作为 childrenButton 的 children 可为函数,参数包含 isPending、isPressed、isHovered、isFocused、isFocusVisible、isDisabledradius 已移除:请使用 Tailwind CSS 类classNames 已移除:请使用 className prop