UI 组件替换指南
版本: 3.0.0 | 更新日期: 2026-02-01
本指南帮助您将现有的 shadcn/ui 或其他 UI 组件迁移到 MBE 设计系统。
概述
MBE 设计系统提供了一套统一的 UI 组件,替换原有的 shadcn/ui 组件。新组件具有:
- 统一的设计语言
- 毛玻璃效果 (Glass Morphism)
- 更好的暗色主题支持
- TypeScript 完整类型支持
组件对照表
| 原组件 (shadcn/ui) | 新组件 (@mbe/ui) | 说明 |
|---|---|---|
Card, CardHeader, CardContent |
GlassCard |
卡片容器 |
Button |
Button |
按钮 |
Badge |
Badge |
徽章 |
Input |
Input |
输入框 |
Skeleton |
Skeleton |
骨架屏 |
useToast, toast |
useToast |
提示通知 |
详细替换指南
1. Card → GlassCard
旧代码
import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from '@/components/ui/card';
<Card>
<CardHeader>
<CardTitle>标题</CardTitle>
<CardDescription>描述文字</CardDescription>
</CardHeader>
<CardContent>
<p>内容区域</p>
</CardContent>
<CardFooter>
<Button>操作按钮</Button>
</CardFooter>
</Card>
新代码
import { GlassCard, Button } from '@mbe/ui';
<GlassCard hover className="p-6">
<div className="mb-4">
<h3 className="text-lg font-semibold">标题</h3>
<p className="text-sm text-gray-400">描述文字</p>
</div>
<div className="mb-4">
<p>内容区域</p>
</div>
<div>
<Button variant="primary">操作按钮</Button>
</div>
</GlassCard>
GlassCard 属性
| 属性 | 类型 | 说明 |
|---|---|---|
variant |
'default' | 'primary' | 'success' | 'warning' | 'error' |
变体样式 |
hover |
boolean |
启用悬停效果 |
glow |
boolean |
启用发光效果 |
onClick |
() => void |
点击事件 |
className |
string |
自定义类名 |
2. Button 替换
旧代码
import { Button } from '@/components/ui/button';
<Button variant="default">默认</Button>
<Button variant="destructive">删除</Button>
<Button variant="outline">轮廓</Button>
<Button variant="secondary">次要</Button>
<Button variant="ghost">幽灵</Button>
<Button variant="link">链接</Button>
<Button disabled>禁用</Button>
新代码
import { Button } from '@mbe/ui';
<Button variant="primary">默认</Button>
<Button variant="danger">删除</Button>
<Button variant="outline">轮廓</Button>
<Button variant="secondary">次要</Button>
<Button variant="ghost">幽灵</Button>
<Button variant="ghost" className="underline">链接</Button>
<Button disabled>禁用</Button>
变体对照
| shadcn/ui | @mbe/ui | 说明 |
|---|---|---|
default |
primary |
主要按钮 |
destructive |
danger |
危险/删除 |
outline |
outline |
轮廓按钮 |
secondary |
secondary |
次要按钮 |
ghost |
ghost |
幽灵按钮 |
link |
ghost + 下划线 |
链接样式 |
新增功能
// 加载状态
<Button loading>加载中...</Button>
// 带图标
import { Plus } from 'lucide-react';
<Button icon={<Plus />}>新增</Button>
// 尺寸
<Button size="sm">小</Button>
<Button size="md">中</Button>
<Button size="lg">大</Button>
3. Badge 替换
旧代码
import { Badge } from '@/components/ui/badge';
<Badge>默认</Badge>
<Badge variant="secondary">次要</Badge>
<Badge variant="destructive">危险</Badge>
<Badge variant="outline">轮廓</Badge>
新代码
import { Badge } from '@mbe/ui';
<Badge variant="default">默认</Badge>
<Badge variant="primary">主要</Badge>
<Badge variant="success">成功</Badge>
<Badge variant="warning">警告</Badge>
<Badge variant="error">错误</Badge>
<Badge variant="info">信息</Badge>
变体对照
| shadcn/ui | @mbe/ui | 说明 |
|---|---|---|
default |
default |
默认灰色 |
secondary |
primary |
主色调 |
destructive |
error |
错误/危险 |
outline |
default |
默认样式 |
| - | success |
成功状态 |
| - | warning |
警告状态 |
| - | info |
信息状态 |
4. Input 替换
旧代码
import { Input } from '@/components/ui/input';
import { Label } from '@/components/ui/label';
<div>
<Label htmlFor="email">邮箱</Label>
<Input id="email" type="email" placeholder="请输入邮箱" />
</div>
新代码
import { Input } from '@mbe/ui';
<div>
<label htmlFor="email" className="block text-sm font-medium mb-2">邮箱</label>
<Input id="email" type="email" placeholder="请输入邮箱" />
</div>
// 带图标
import { Mail } from 'lucide-react';
<Input icon={<Mail />} type="email" placeholder="请输入邮箱" />
// 错误状态
<Input error errorMessage="邮箱格式不正确" />
5. Skeleton 替换
旧代码
import { Skeleton } from '@/components/ui/skeleton';
<Skeleton className="h-4 w-[250px]" />
<Skeleton className="h-4 w-[200px]" />
新代码
import { Skeleton } from '@mbe/ui';
<Skeleton className="h-4 w-[250px]" />
<Skeleton className="h-4 w-[200px]" />
Skeleton 组件用法基本相同,只需更改导入路径。
6. Toast 替换
旧代码
import { useToast } from '@/components/ui/use-toast';
import { Toaster } from '@/components/ui/toaster';
// 在根组件
<Toaster />
// 在组件中
const { toast } = useToast();
toast({
title: "成功",
description: "操作已完成",
});
新代码
import { useToast, ToastProvider } from '@mbe/ui';
// 在根组件
<ToastProvider>
<App />
</ToastProvider>
// 在组件中
const { toast } = useToast();
toast.success('操作已完成');
toast.error('操作失败');
toast.warning('请注意');
toast.info('提示信息');
Toast 方法对照
| shadcn/ui | @mbe/ui |
|---|---|
toast({ title, description }) |
toast.info(message) |
toast({ title, variant: 'destructive' }) |
toast.error(message) |
| - | toast.success(message) |
| - | toast.warning(message) |
批量替换脚本
使用搜索替换
在 VS Code 中使用正则表达式批量替换:
- 打开搜索替换 (Ctrl+Shift+H)
- 启用正则表达式模式
替换导入语句
搜索:
import \{ Card[^}]*\} from ['"]@/components/ui/card['"];?
替换:
import { GlassCard } from '@mbe/ui';
替换 Button 导入
搜索:
import \{ Button \} from ['"]@/components/ui/button['"];?
替换:
import { Button } from '@mbe/ui';
常见问题
Q: 样式不一致怎么办?
A: 确保已正确配置 Tailwind:
// tailwind.config.ts
import mbeConfig from '@mbe/tailwind-config';
export default {
presets: [mbeConfig],
content: [
'./node_modules/@mbe/ui/**/*.{js,ts,jsx,tsx}',
],
};
Q: TypeScript 类型报错?
A: 确保安装了最新版本:
pnpm add @mbe/ui@latest @mbe/design-tokens@latest
Q: 如何保持旧组件兼容?
A: 可以逐步迁移,两套组件可以共存:
// 旧组件
import { Card } from '@/components/ui/card';
// 新组件
import { GlassCard } from '@mbe/ui';
// 在同一页面中混用(过渡期)
迁移检查清单
- 更新
tailwind.config.ts使用@mbe/tailwind-config - 在
globals.css导入@mbe/design-tokens/dist/tokens.css - 替换 Card → GlassCard
- 替换 Button 导入和变体
- 替换 Badge 导入和变体
- 替换 Input 导入
- 替换 Skeleton 导入
- 替换 Toast 系统
- 添加 ToastProvider 到根组件
- 测试所有页面
相关文档
UI 组件替换指南 | MBE v3.0.0 | 2026-02-01