shadcn/ui 组件模式
概览
shadcn/ui 是基于 Radix UI 原语和 Tailwind CSS 样式的可访问 React 组件集合。它帮助开发者轻松构建美观且一致的 UI,无需从头开始。shadcn/ui 使用 Radix UI 原语来确保可访问性和键盘导航,Tailwind CSS 用于灵活的样式设计,组件可以轻松复制粘贴到您的项目中。这种方法提供了完整的类型安全性、定制能力和与流行表单库的集成。
为什么这很重要
- 减少开发时间:shadcn/ui 减少了 50-60% 的 UI 开发时间
- 提高可访问性:内置的可访问性确保合规性
- 降低维护成本:组件复用和一致的样式减少了维护工作
- 增加设计一致性:一致的设计系统提高了品牌一致性
- 增强用户体验:平滑的动画和交互提高了用户体验
核心概念
1. Radix UI 原语
可访问的构建块:
- 对话框:可访问的对话框和模态框
- 下拉菜单:可访问的下拉菜单
- 标签页:可访问的标签页界面
- 弹出层:可访问的弹出层内容
- 工具提示:可访问的工具提示
- 选择框:可访问的选择下拉框
- 复选框:可访问的复选框
- 单选组:可访问的单选组
- 手风琴:可访问的手风琴内容
- 警告对话框:可访问的警告对话框
- 滑块:可访问的滑块
- 开关:可访问的切换开关
- 吐司:可访问的吐司通知
- 命令:可访问的命令面板
2. Tailwind CSS 样式
实用工具优先样式:
- 实用工具类:小型、单一用途的 CSS 类
- 设计令牌:一致的颜色、间距、排版
- 响应式修饰符:断点特定的类
- 状态修饰符:悬停、焦点、活动状态
- 暗色模式:内置的暗色模式支持
- 自定义配置:可扩展的 Tailwind 配置
3. 组件组合
可组合的组件架构:
- 基础组件:作为基础的 Radix UI 原语
- 样式组件:Tailwind 样式组件
- 自定义组件:扩展和定制的组件
- 组合模式:组件组合以提供灵活性
4. TypeScript 支持
完整的类型安全性:
- 属性类型:所有属性的 TypeScript 接口
- ForwardRef:适当的 ref 转发
- 泛型类型:在需要时支持泛型类型
- 推断:从表单模式中推断类型
5. 定制
灵活的定制:
- Tailwind 类:直接类覆盖
- 主题:主题令牌定制
- 变体:使用 class-variance-authority 的组件变体
- 扩展:不修改原件的情况下扩展组件
快速开始
- 初始化 shadcn/ui:在项目中运行初始化命令
- 选择选项:选择样式和配置选项
- 添加组件:逐个安装所需的组件
- 定制主题:用品牌颜色和令牌扩展主题
- 创建组件:使用原语构建自定义组件
- 集成表单:与 React Hook Form 和 Zod 一起使用
- 添加暗色模式:使用主题提供者实现暗色模式
- 测试可访问性:验证键盘导航和屏幕阅读器支持
# 初始化 shadcn/ui
npx shadcn-ui@latest init
# 添加组件
npx shadcn-ui@latest add button
npx shadcn-ui@latest add card
npx shadcn-ui@latest add input
npx shadcn-ui@latest add dialog
生产清单
- [ ] 使用适当配置初始化 shadcn/ui
- [ ] 使用主题扩展配置 Tailwind CSS
- [ ] 安装基础组件
- [ ] 创建和样式化自定义组件
- [ ] 正确配置 TypeScript 类型
- [ ] 使用 cn 实用工具函数进行条件类
- [ ] 扩展组件,而不是直接修改
- [ ] 验证可访问性(键盘、屏幕阅读器)
- [ ] 优化捆绑包大小(摇树)
- [ ] 集成表单验证(React Hook Form + Zod)
- [ ] 实施暗色模式
- [ ] 测试响应式设计
- [ ] 验证浏览器兼容性
- [ ] 文档化组件库
反模式
- 过度定制:过度定制使升级变得困难
- 可访问性差:不考虑可访问性限制了用户基础
- 捆绑包膨胀:不优化捆绑包大小会导致性能问题
- 不一致的样式:不一致的样式降低了可维护性
- 类型安全性差:不使用 TypeScript 降低了开发体验
- 性能问题:不优化组件会导致渲染缓慢
- 修改原件:修改原始组件会破坏更新
- 不使用原语:不使用 Radix UI 原语降低了可访问性
- 文档差:缺少文档使组件难以使用
- 复杂组件:过于复杂的组件难以维护
集成点
- Radix UI:可访问的原语
- Tailwind CSS:样式框架
- React Hook Form:表单状态管理
- Zod:模式验证
- TanStack Table:数据表组件
- Lucide Icons:图标库
react-best-practices用于 React 模式mui-material用于替代 UI 库form-handling用于表单模式tailwind-patterns用于 Tailwind 模式
进一步阅读
- shadcn/ui 文档 - 官方 shadcn/ui 文档
- Radix UI 文档 - Radix UI 原语文档
- Tailwind CSS 文档 - Tailwind CSS 文档
- React Hook Form - 表单管理库
- Zod - 模式验证库
- class-variance-authority - 组件变体管理
- 可访问性指南 - WCAG 可访问性指南