ProComponents, templates & AI tooling
HeroUI
27.7k

Badge

Badge 从 HeroUI v2 到 v3 的迁移指南。

完整的 API 参考、样式指南与高级示例请参阅 v3 Badge 文档。本指南只关注从 HeroUI v2 的迁移。

结构变化

在 v2 中,Badge 是一个包装组件,相对其子元素进行内容定位:

import { Badge, Avatar } from "@heroui/react";

export default function App() {
  return (
    <Badge content="5" color="primary">
      <Avatar src="https://i.pravatar.cc/300" />
    </Badge>
  );
}

在 v3 中,Badge 改为复合组件模式,由 Badge.Anchor 负责定位:

import { Badge, Avatar } from "@heroui/react";

export default function App() {
  return (
    <Badge.Anchor>
      <Avatar>
        <Avatar.Image src="https://i.pravatar.cc/300" alt="User" />
        <Avatar.Fallback>U</Avatar.Fallback>
      </Avatar>
      <Badge color="accent">5</Badge>
    </Badge.Anchor>
  );
}

主要变化

1. 组件结构

v2: 单一 Badge 组件包裹子节点,通过 content prop 设置徽章文本
v3: 复合组件:Badge.Anchor(定位包装器)、Badge(徽章本身)、Badge.Label(文本插槽,字符串子节点会自动包裹)

2. 变体

v2: solidflatfadedshadow
v3: primarysecondarysoft

3. 颜色

v2: defaultprimarysecondarysuccesswarningdanger
v3: defaultaccentsuccesswarningdanger

4. Prop 变更

v2 propv3 位置说明
contentBadge 子节点内容现在以子节点传入
childrenBadge.Anchor锚定元素放入 Badge.Anchor 内部
variantBadge取值变化(详见变体映射)
colorBadgeprimaryaccentsecondary 已移除
sizeBadge相同(smmdlg
placementBadge相同(top-righttop-leftbottom-rightbottom-left
shape-已移除(请改用 Tailwind CSS)
showOutline-已移除(请改用 Tailwind CSS,例如 border-2
disableOutline-已移除
disableAnimation-已移除
isInvisible-已移除(请使用条件渲染)
isOneChar-已移除(请改用 Tailwind CSS)
isDot-省略子节点即可渲染为圆点
classNames-改在各子组件上使用 className

5. 变体映射

v2 变体v3 对应项说明
solidprimary实心背景
flatsoft浅色背景
fadedsecondary边框 + 背景
shadowprimary配合 Tailwind 的 shadow-*

6. 颜色映射

v2 颜色v3 对应项说明
defaultdefault相同
primaryaccent已重命名
secondarydefaultaccent视上下文而定
successsuccess相同
warningwarning相同
dangerdanger相同

迁移示例

基本徽章

import { Badge, Avatar } from "@heroui/react";

<Badge content="5" color="primary">
  <Avatar src="https://i.pravatar.cc/300" />
</Badge>
import { Badge, Avatar } from "@heroui/react";

<Badge.Anchor>
  <Avatar>
    <Avatar.Image src="https://i.pravatar.cc/300" alt="User" />
    <Avatar.Fallback>U</Avatar.Fallback>
  </Avatar>
  <Badge color="accent">5</Badge>
</Badge.Anchor>

圆点徽章

<Badge content="" isDot color="success">
  <Avatar src="https://i.pravatar.cc/300" />
</Badge>
<Badge.Anchor>
  <Avatar>
    <Avatar.Image src="https://i.pravatar.cc/300" alt="User" />
    <Avatar.Fallback>U</Avatar.Fallback>
  </Avatar>
  <Badge color="success" />
</Badge.Anchor>

位置

<Badge content="5" placement="bottom-right" color="danger">
  <Avatar src="https://i.pravatar.cc/300" />
</Badge>
<Badge.Anchor>
  <Avatar>
    <Avatar.Image src="https://i.pravatar.cc/300" alt="User" />
    <Avatar.Fallback>U</Avatar.Fallback>
  </Avatar>
  <Badge placement="bottom-right" color="danger">5</Badge>
</Badge.Anchor>

可见性切换

const [isInvisible, setIsInvisible] = useState(false);

<Badge content="5" isInvisible={isInvisible} color="danger">
  <Avatar src="https://i.pravatar.cc/300" />
</Badge>
const [isVisible, setIsVisible] = useState(true);

<Badge.Anchor>
  <Avatar>
    <Avatar.Image src="https://i.pravatar.cc/300" alt="User" />
    <Avatar.Fallback>U</Avatar.Fallback>
  </Avatar>
  {isVisible && <Badge color="danger">5</Badge>}
</Badge.Anchor>

带图标内容

import { Icon } from "@iconify/react";

<Badge content={<Icon icon="gravity-ui:check" />} color="success">
  <Avatar src="https://i.pravatar.cc/300" />
</Badge>
import { Icon } from "@iconify/react";

<Badge.Anchor>
  <Avatar>
    <Avatar.Image src="https://i.pravatar.cc/300" alt="User" />
    <Avatar.Fallback>U</Avatar.Fallback>
  </Avatar>
  <Badge color="success">
    <Icon icon="gravity-ui:check" />
  </Badge>
</Badge.Anchor>

样式变更

v2:classNames prop

<Badge
  classNames={{
    base: "custom-base",
    badge: "custom-badge"
  }}
/>

v3:直接使用 className prop

<Badge.Anchor className="custom-anchor">
  <Avatar />
  <Badge className="custom-badge">
    <Badge.Label className="custom-label">5</Badge.Label>
  </Badge>
</Badge.Anchor>

组件结构

v3 Badge 遵循以下结构:

Badge.Anchor (positioning wrapper)
  ├── [Anchored element: Avatar, Button, etc.]
  └── Badge (the badge indicator)
      └── Badge.Label (auto-wrapped for string/number children)

总结

  1. 组件结构Badge 包裹子节点 → Badge.Anchor + Badge 作为同级
  2. 移除 content propcontent prop → 将内容作为 Badge 的子节点传入
  3. 圆点徽章isDot prop → 省略子节点
  4. 可见性isInvisible prop → 改用条件渲染
  5. 变体收敛:从 4 个变体减少为 3 个(primarysecondarysoft
  6. 颜色变化primaryaccentsecondary 已移除
  7. 移除的 propshapeshowOutlinedisableAnimationisOneChar —— 请改用 Tailwind CSS
  8. 移除 classNames:改在各复合子组件上使用 className

本页目录