Back to Heroui

Chip

apps/docs/content/docs/cn/react/migration/(components)/chip.mdx

3.2.17.4 KB
Original Source
<Callout type="info"> 完整的 API 参考、样式指南与高级示例请参阅 [v3 Chip 文档](/docs/react/components/chip)。本指南只关注从 HeroUI v2 的迁移。 </Callout>

关键变化

1. 变体

v2: solidborderedlightflatfadedshadowdot
v3: primarysecondarytertiarysoft

2. 颜色

v2: defaultprimarysecondarysuccesswarningdanger
v3: defaultaccentsuccesswarningdanger

3. 复合组件模式

v3 引入复合组件模式,并提供 Chip.Label 子组件:

  • Chip.Label:渲染 Chip 内的标签文本。纯文本 children 会自动包在 <Chip.Label> 中,因此多数场景不必手写;需要自定义 className 时可显式使用。
tsx
<Chip>Badge</Chip>
<Chip>
  <Chip.Label className="uppercase tracking-wide">Badge</Chip.Label>
</Chip>

4. 尺寸变体

v2: smmdlg(通过 size prop)
v3: smmdlg(通过 size prop,API 相同)

可用尺寸与 v2 一致,但 v3 通过 BEM 风格的 CSS class(chip--smchip--mdchip--lg)应用。默认尺寸为 md

tsx
<Chip size="sm">Small</Chip>
<Chip size="md">Medium (default)</Chip>
<Chip size="lg">Large</Chip>

5. 复合变体 class

v3 支持组合变体与颜色 class,以实现更精细的样式。下列复合 class 在 CSS 中带有默认样式:

primary 变体组合: .chip--primary.chip--accent.chip--primary.chip--success.chip--primary.chip--warning.chip--primary.chip--danger

soft 变体组合: .chip--accent.chip--soft.chip--success.chip--soft.chip--warning.chip--soft.chip--danger.chip--soft

你也可以在 CSS 中通过 @layer components 为其他任意组合(例如 .chip--secondary.chip--accent)补充样式。

6. Prop 变更

v2 propv3 位置说明
radius已移除(例如使用 Tailwind rounded-full
avatar使用 children(例如将 <Avatar /> 作为第一个子节点)
startContentendContent直接使用 children
onClose手动实现关闭(例如使用 CloseButton
classNames使用 className
isDisabled使用条件渲染或 Tailwind(例如 opacity-50

7. 变体映射

v2 变体v3 对应说明
solidprimary实心背景
borderedsecondary边框 + 透明背景
lightsoft浅色背景
flattertiary透明背景
fadedsecondary观感相近
shadowprimary配合 Tailwind shadow-* class
dot不再内置,请自行实现

8. 颜色映射

v2 颜色v3 对应说明
defaultdefault相同
primaryaccent已重命名
secondarydefaultaccent视场景选择
successsuccess相同
warningwarning相同
dangerdanger相同

结构变化

在 v2 中,Chip 是一个通过大量 prop 控制样式的组件:

tsx
import { Chip } from "@heroui/react";

export default function App() {
  return <Chip>Chip</Chip>;
}

在 v3 中,Chip 的 API 更精简,变体更少:

tsx
import { Chip } from "@heroui/react";

export default function App() {
  return <Chip>Chip</Chip>;
}

迁移示例

变体与颜色

<Tabs items={["v2", "v3"]}> <Tab value="v2"> tsx <Chip variant="solid">Solid</Chip> <Chip variant="bordered">Bordered</Chip> <Chip variant="light">Light</Chip> <Chip color="primary">Primary</Chip> <Chip color="success">Success</Chip> </Tab> <Tab value="v3"> tsx <Chip variant="primary">Primary</Chip> <Chip variant="secondary">Secondary</Chip> <Chip variant="soft">Soft</Chip> <Chip color="accent">Accent</Chip> <Chip color="success">Success</Chip> </Tab> </Tabs>

带图标

<Tabs items={["v2", "v3"]}> <Tab value="v2"> tsx import { Icon } from "@iconify/react"; <Chip startContent={<Icon icon="gravity-ui:check" />}> Chip </Chip> <Chip endContent={<Icon icon="gravity-ui:chevron-down" />}> Chip </Chip> </Tab> <Tab value="v3"> tsx import { Icon } from "@iconify/react"; <Chip> <Icon icon="gravity-ui:check" /> Chip </Chip> <Chip> Chip <Icon icon="gravity-ui:chevron-down" /> </Chip> </Tab> </Tabs>

带 Avatar

<Tabs items={["v2", "v3"]}> <Tab value="v2"> ```tsx import { Avatar } from "@heroui/react";

<Chip
  avatar={<Avatar name="JW" src="https://example.com/avatar.jpg" />}
  variant="flat"
>
  Avatar
</Chip>
```
</Tab> <Tab value="v3"> ```tsx import { Avatar, Chip } from "@heroui/react";
<Chip variant="tertiary">
  <Avatar size="sm">
    <Avatar.Image src="https://example.com/avatar.jpg" alt="JW" />
    <Avatar.Fallback>JW</Avatar.Fallback>
  </Avatar>
  Avatar
</Chip>
```
</Tab> </Tabs>

带关闭按钮

<Tabs items={["v2", "v3"]}> <Tab value="v2"> tsx <Chip onClose={() => console.log("close")}> Chip </Chip> </Tab> <Tab value="v3"> ```tsx import { CloseButton } from "@heroui/react";

<Chip>
  Chip
  <CloseButton 
    aria-label="Close chip"
    onPress={() => console.log("close")}
  />
</Chip>
```
</Tab> </Tabs>

已移除的变体

<Tabs items={["v2", "v3"]}> <Tab value="v2"> tsx <Chip variant="dot">Dot</Chip> <Chip variant="shadow">Shadow</Chip> </Tab> <Tab value="v3"> tsx import { Icon } from "@iconify/react"; <Chip> <Icon icon="gravity-ui:circle-fill" width={6} /> Dot </Chip> <Chip variant="primary" className="shadow-md"> Shadow </Chip> </Tab> </Tabs>

样式变化

v2:classNames prop

tsx
<Chip 
  classNames={{
    base: "custom-base",
    content: "custom-content",
    dot: "custom-dot",
    avatar: "custom-avatar",
    closeButton: "custom-close-button"
  }}
/>

v3:直接使用 className prop

tsx
<Chip className="custom-base">
  <span className="custom-content">Chip</span>
</Chip>

总结

  1. 变体收敛:由 7 种变体收敛为 4 种。
  2. 颜色调整primaryaccent,并弱化 secondary 的对应关系。
  3. 复合组件:新增 Chip.Label;纯文本 children 会自动包在 Chip.Label 中。
  4. 尺寸变体:仍可通过 size prop 使用 smmdlg,并以 BEM class(chip--smchip--mdchip--lg)落地。
  5. 复合变体 class:变体 + 颜色组合(例如 .chip--primary.chip--accent.chip--soft.chip--success)具备内置样式,并可在 @layer components 中扩展。
  6. radius 已移除:请改用 Tailwind CSS class。
  7. avatar prop 已移除:请改用 children
  8. startContent / endContent 已移除:请改用 children
  9. 关闭能力已移除:请使用 CloseButton 自行组合。
  10. dot 变体已移除:请用图标等方式自行实现。
  11. shadow 变体已移除:请使用 Tailwind shadow-* class。
  12. isDisabled prop 已移除:请使用条件渲染或 CSS class。
  13. classNames 已移除:请直接使用 className prop。