apps/docs/content/docs/cn/react/migration/(components)/spacer.mdx
v2: 来自 @heroui/react 的 <Spacer> 组件
v3: Tailwind CSS margin 工具类(ml-*、mr-*、mt-*、mb-*、mx-*、my-*)
v2 的 Spacer 组件提供以下 prop,可映射到 Tailwind 工具类:
| v2 prop | v3 对应 | 说明 |
|---|---|---|
x={n} | ml-{n} 或 mx-{n} | 水平外边距(左侧或两侧) |
y={n} | mt-{n} 或 my-{n} | 垂直外边距(顶部或两侧) |
isInline | inline-block 或 block | 显示类型 |
v2 中的间距数值与 Tailwind 的 spacing 刻度一致:
x={1} → ml-1(0.25rem / 4px)x={2} → ml-2(0.5rem / 8px)x={4} → ml-4(1rem / 16px)y={4} → mt-4(1rem / 16px)<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx import { Spacer } from "@heroui/react"; <div> <div>Item 1</div> <Spacer y={4} /> <div>Item 2</div> </div> <div className="flex"> <div>Item 1</div> <Spacer x={4} isInline /> <div>Item 2</div> </div>
</Tab>
<Tab value="v3">
tsx <div> <div>Item 1</div> <div className="mt-4">Item 2</div> </div> <div className="flex"> <div>Item 1</div> <div className="ml-4">Item 2</div> </div>
</Tab>
</Tabs>
在 flex 与 grid 布局中,使用 gap 往往比 Spacer 更合适:
<Tabs items={["v2", "v3"]}>
<Tab value="v2">
tsx import { Spacer } from "@heroui/react"; <div className="flex"> <div>Item 1</div> <Spacer x={4} isInline /> <div>Item 2</div> </div> <div className="flex flex-col"> <Button>Button 1</Button> <Spacer y={2} /> <Button>Button 2</Button> </div>
</Tab>
<Tab value="v3">
tsx <div className="flex gap-4"> <div>Item 1</div> <div>Item 2</div> </div> <div className="flex flex-col gap-2"> <Button>Button 1</Button> <Button>Button 2</Button> </div>
</Tab>
</Tabs>
<Tabs items={["v2", "v3"]}> <Tab value="v2"> ```tsx import { Spacer, Button } from "@heroui/react";
export default function App() {
return (
<div>
<h1>Title</h1>
<Spacer y={4} />
<p>Description text</p>
<Spacer y={8} />
<div className="flex">
<Button>Cancel</Button>
<Spacer x={4} isInline />
<Button>Submit</Button>
</div>
</div>
);
}
```
export default function App() {
return (
<div>
<h1>Title</h1>
<p className="mt-4">Description text</p>
<div className="mt-8 flex gap-4">
<Button>Cancel</Button>
<Button>Submit</Button>
</div>
</div>
);
}
```
Tailwind CSS spacing 刻度(与 v2 Spacer 数值对应):
| 数值 | 尺寸 | Tailwind class |
|---|---|---|
0 | 0px | m-0、ml-0、mt-0 等 |
px | 1px | m-px、ml-px、mt-px 等 |
0.5 | 0.125rem(2px) | m-0.5、ml-0.5、mt-0.5 等 |
1 | 0.25rem(4px) | m-1、ml-1、mt-1 等 |
2 | 0.5rem(8px) | m-2、ml-2、mt-2 等 |
3 | 0.75rem(12px) | m-3、ml-3、mt-3 等 |
4 | 1rem(16px) | m-4、ml-4、mt-4 等 |
5 | 1.25rem(20px) | m-5、ml-5、mt-5 等 |
6 | 1.5rem(24px) | m-6、ml-6、mt-6 等 |
8 | 2rem(32px) | m-8、ml-8、mt-8 等 |
10 | 2.5rem(40px) | m-10、ml-10、mt-10 等 |
12 | 3rem(48px) | m-12、ml-12、mt-12 等 |
16 | 4rem(64px) | m-16、ml-16、mt-16 等 |
20 | 5rem(80px) | m-20、ml-20、mt-20 等 |
用 gap 工具类替代 Spacer 组件:
// ✅ 推荐
<div className="flex gap-4">
<Button>Button 1</Button>
<Button>Button 2</Button>
</div>
// ❌ 不推荐
<div className="flex">
<Button>Button 1</Button>
<div className="ml-4"><Button>Button 2</Button></div>
</div>
// ✅ 推荐
<div className="space-y-4">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
// 备选
<div>
<div>Item 1</div>
<div className="mt-4">Item 2</div>
<div className="mt-4">Item 3</div>
</div>
将 margin 直接写在元素上,而不是使用 Spacer:
// ✅ 推荐
<div className="mt-4">Content</div>
// ❌ 不推荐
<>
<Spacer y={4} />
<div>Content</div>
</>
Spacer 组件。import { Spacer } from "@heroui/react"。ml-*、mt-*、mx-*、my-* 等)。gap-*。space-y-* 与 space-x-* 保持一致的间距。@heroui/react 的导入中删除 Spacer。<Spacer x={n} /> 替换为 ml-{n} 或 mx-{n} 等 class。<Spacer y={n} /> 替换为 mt-{n} 或 my-{n} 等 class。gap-{n} 替代 Spacer。space-y-{n} 或 space-x-{n}。// 使用 space-y 工具类
<div className="space-y-4">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>
// 使用 gap 工具类
<div className="flex gap-4">
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
</div>
<div>
<div>Item 1</div>
<div className="mt-8">Item 2 (with custom spacing)</div>
<div className="mt-4">Item 3</div>
</div>