菜单

复杂组件

相关源文件

复杂组件是复杂的 UI 元素,它们集成了多个依赖项、管理大量内部状态或提供高级交互功能。这些组件通常由多个子组件协同工作组成,并且经常依赖外部库来实现专业行为,如数据可视化、日期处理或可访问性基础。

有关基本交互元素的说明,请参阅 核心组件。有关结构布局组件的说明,请参阅 布局组件。有关预构建组件组合的说明,请参阅 组件块

架构概述

shadcn/ui 中的复杂组件遵循分层架构模式,其中外部库基础通过自定义样式、主题集成和附加功能进行封装。

来源: apps/www/registry/new-york/ui/chart.tsx1-10 apps/www/content/docs/components/toast.mdx58-60 apps/www/content/docs/components/calendar.mdx40-43

图表组件

Chart 系统是最复杂的组件,它提供了一个完整的、基于 Recharts 构建的数据可视化框架,并集成了主题和配置管理。

Chart 系统架构

来源: apps/www/registry/new-york/ui/chart.tsx11-35 apps/www/registry/new-york/ui/chart.tsx37-68 apps/www/registry/new-york/ui/chart.tsx70-101

Chart 配置系统

ChartConfig 类型为图表主题和标签提供了一个灵活的配置系统

属性类型描述
labelReact.ReactNode数据系列的显示标签
iconReact.ComponentType可选图标组件
color字符串静态颜色值
themeRecord<keyof typeof THEMES, string>主题特定的颜色映射

配置通过 ChartContainer 建立的 ChartContext.Provider 内的 useChart hook 访问。

来源: apps/www/registry/new-york/ui/chart.tsx11-19 apps/www/registry/new-york/ui/chart.tsx21-35

动态主题实现

ChartStyle 组件根据图表配置生成动态 CSS

该系统支持静态颜色和主题感知的颜色映射,通过 data-chart 属性为特定的图表实例生成作用域的 CSS 自定义属性。

来源: apps/www/registry/new-york/ui/chart.tsx8-9 apps/www/registry/new-york/ui/chart.tsx70-101

Chart 注册表配置

组件依赖项注册表依赖项
chartrecharts, lucide-reactcard

来源: apps/www/public/registry/styles/new-york/chart.json3-9 apps/www/public/r/styles/new-york/chart.json6-12

Toast 通知系统

Toast 系统提供了一个全面的通知框架,包含多个实现文件和状态管理。

Toast 组件结构

Toast 系统需要安装和配置多个组件

  1. 核心组件toast.tsx, toaster.tsx, use-toast.tsx
  2. 布局集成Toaster 组件添加到根布局
  3. 使用模式useToast hook 用于触发通知

来源: apps/www/content/docs/components/toast.mdx64-74 apps/www/content/docs/components/toast.mdx32-46 apps/www/content/docs/components/toast.mdx104-108

Toast 使用模式

变体用途描述
默认toast({ title, description })标准通知
带标题toast({ title: "...", description: "..." })结构化内容
带操作toast({ action: <ToastAction>... })交互式通知
破坏性toast({ variant: "destructive" })错误通知

来源: apps/www/content/docs/components/toast.mdx138-153

Calendar 组件

Calendar 组件基于 React DayPicker 提供复杂的日期选择功能。

Calendar 依赖项和集成

依赖项版本目的
react-day-picker8.10.1核心日期选择器功能
date-fns最新版日期操作工具
button (组件)内部信息UI 一致性

Calendar 组件与 Button 组件集成用于导航控件,并通过 React DayPicker 的 API 支持广泛的自定义。

来源: apps/www/content/docs/components/calendar.mdx40-43 apps/www/content/docs/components/calendar.mdx45-47

Input OTP 组件

一个复杂的输入组件,用于一次性密码输入,具有高级的可访问性和视觉反馈。

OTP 组件架构

该组件使用 input-otp 库,并提供复杂的视觉反馈,包括插入符动画和单个输入槽的状态管理。

来源: apps/v4/registry/new-york-v4/ui/input-otp.tsx9-27 apps/v4/registry/new-york-v4/ui/input-otp.tsx39-67 apps/v4/registry/new-york-v4/ui/input-otp.tsx60-64

其他复杂组件

基于 Embla Carousel 构建,提供基于运动的内容导航,具有广泛的配置选项

  • 依赖项embla-carousel-react
  • 特性:尺寸控制、间距管理、方向支持、API 访问、事件处理、插件系统
  • 配置:通过 Embla 选项的 opts prop

来源: apps/www/content/docs/components/carousel.mdx40-45 apps/www/content/docs/components/carousel.mdx177-194

表格组件

响应式表格组件,专为与数据表格库集成而设计

  • 集成:专为与 @tanstack/react-table 一起使用而设计
  • 功能:支持排序、过滤、分页
  • 组件TableTableBodyTableCaptionTableCellTableHeadTableHeaderTableRow

来源: apps/www/content/docs/components/table.mdx78-81

基于 Radix UI 原语构建的复杂导航组件

  • 导航菜单:基于 @radix-ui/react-navigation-menu 构建
  • 菜单栏:基于 @radix-ui/react-menubar 构建
  • 滚动区域:基于 @radix-ui/react-scroll-area 构建

来源: apps/www/content/docs/components/navigation-menu.mdx34-36 apps/www/content/docs/components/menubar.mdx34-36 apps/www/content/docs/components/scroll-area.mdx36-39

常见模式

shadcn/ui 中的复杂组件共享几个架构模式

  1. 外部库封装:大多数复杂组件都使用自定义样式和主题来封装外部库
  2. 多文件结构:组件通常需要多个文件(组件、钩子、实用文件)
  3. 基于上下文的配置:使用 React Context 进行组件级配置和主题化
  4. Radix UI 集成:高度依赖 Radix UI 原语以实现可访问性
  5. 动态样式:CSS-in-JS 或动态 CSS 生成,用于支持主题的样式

来源: apps/www/lib/rehype-component.ts31-63 apps/www/registry/new-york/ui/chart.tsx25-35