通用组件

📎 引用文件

本文引用的文件 - ErrorBoundary.tsx - Skeleton.tsx - BrandMark.tsx - ConfirmDialog.tsx - ErrorBoundary.test.tsx - Skeleton.test.tsx - ConfirmDialog.test.tsx

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向 Vibe-Trading 前端应用的通用组件,聚焦以下四个基础 UI 能力: - 错误边界(ErrorBoundary):捕获子树渲染期异常并提供可恢复的降级展示。 - 骨架屏(Skeleton):在数据加载或计算期间提供占位与动画反馈。 - 品牌标识(BrandMark):以 SVG 形式统一呈现品牌视觉资产。 - 确认对话框(ConfirmDialog):轻量、无外部依赖的可访问性友好的二次确认弹窗。

文档将详细说明各组件的 Props 接口、事件处理、样式定制选项、最佳实践、复用策略、性能优化技巧与可访问性支持,并给出集成示例路径与常见问题排查建议。

项目结构

通用组件位于 frontend/src/components/common 目录下,配套单元测试位于 tests 子目录。它们被业务页面与布局组件广泛复用,构成应用的基础 UI 层。

graph TB subgraph "通用组件" EB["ErrorBoundary"] SK["Skeleton / SkeletonMetrics / SkeletonChart"] BM["BrandMark"] CD["ConfirmDialog"] end subgraph "测试" TEB["ErrorBoundary.test.tsx"] TSK["Skeleton.test.tsx"] TCD["ConfirmDialog.test.tsx"] end EB --> TEB SK --> TSK CD --> TCD

图表来源 - ErrorBoundary.tsx:1-27 - Skeleton.tsx:1-23 - BrandMark.tsx:1-31 - ConfirmDialog.tsx:1-128 - ErrorBoundary.test.tsx:1-62 - Skeleton.test.tsx:1-47 - ConfirmDialog.test.tsx:1-48

章节来源 - ErrorBoundary.tsx:1-27 - Skeleton.tsx:1-23 - BrandMark.tsx:1-31 - ConfirmDialog.tsx:1-128

核心组件

章节来源 - ErrorBoundary.tsx:1-27 - Skeleton.tsx:1-23 - BrandMark.tsx:1-31 - ConfirmDialog.tsx:1-128

架构总览

通用组件之间保持低耦合,各自承担单一职责: - ErrorBoundary 包裹任意子树,隔离崩溃影响范围。 - Skeleton 作为占位符,配合数据流状态切换显示。 - BrandMark 作为静态视觉元素,不参与业务逻辑。 - ConfirmDialog 通过受控 open 属性与回调驱动交互,不持有业务状态。

graph LR App["应用页面/布局"] --> |包裹| EB["ErrorBoundary"] App --> |加载态| SK["Skeleton*"] App --> |品牌展示| BM["BrandMark"] App --> |关键操作| CD["ConfirmDialog"]

图表来源 - ErrorBoundary.tsx:1-27 - Skeleton.tsx:1-23 - BrandMark.tsx:1-31 - ConfirmDialog.tsx:1-128

详细组件分析

错误边界(ErrorBoundary)

flowchart TD Start(["渲染子树"]) --> Try{"是否抛出异常?"} Try --> |否| RenderChildren["渲染 children"] Try --> |是| SetState["设置 hasError=true<br/>记录 error"] SetState --> Fallback{"是否提供 fallback?"} Fallback --> |是| RenderCustom["渲染自定义 fallback"] Fallback --> |否| RenderDefault["渲染默认错误提示"] RenderChildren --> End(["结束"]) RenderCustom --> End RenderDefault --> End

图表来源 - ErrorBoundary.tsx:8-25

章节来源 - ErrorBoundary.tsx:1-27 - ErrorBoundary.test.tsx:1-62

骨架屏(Skeleton)

classDiagram class Skeleton { +className? : string +style? : CSSProperties } class SkeletonMetrics { } class SkeletonChart { +height? : number } SkeletonMetrics --> Skeleton : "组合" SkeletonChart --> Skeleton : "组合"

图表来源 - Skeleton.tsx:3-22

章节来源 - Skeleton.tsx:1-23 - Skeleton.test.tsx:1-47

品牌标识(BrandMark)

graph LR BM["BrandMark"] --> SVG["SVG 矢量图"] SVG --> Grad["线性渐变背景"] SVG --> Candles["三根上涨蜡烛图形"]

图表来源 - BrandMark.tsx:1-31

章节来源 - BrandMark.tsx:1-31

确认对话框(ConfirmDialog)

sequenceDiagram participant U as "用户" participant P as "父组件" participant D as "ConfirmDialog" U->>P : 触发打开 P-->>D : open=true D->>D : 聚焦确认按钮 U->>D : Tab/Shift+Tab D->>D : 焦点在对话框内循环 U->>D : 按 Esc D-->>P : 调用 onCancel() P-->>D : open=false D->>D : 恢复先前焦点

图表来源 - ConfirmDialog.tsx:23-127

章节来源 - ConfirmDialog.tsx:1-128 - ConfirmDialog.test.tsx:1-48

依赖分析

graph LR EB["ErrorBoundary"] --> I18N["i18n"] EB --> ICON["lucide-react"] SK["Skeleton"] --> CN["cn 工具"] SK --> TW["Tailwind 动画"] BM["BrandMark"] --> NONE["无依赖"] CD["ConfirmDialog"] --> PORTAL["react-dom createPortal"]

图表来源 - ErrorBoundary.tsx:1-27 - Skeleton.tsx:1-23 - BrandMark.tsx:1-31 - ConfirmDialog.tsx:1-128

章节来源 - ErrorBoundary.tsx:1-27 - Skeleton.tsx:1-23 - BrandMark.tsx:1-31 - ConfirmDialog.tsx:1-128

性能考虑

[本节为通用指导,不直接分析具体文件]

故障排查指南

章节来源 - ErrorBoundary.test.tsx:1-62 - Skeleton.test.tsx:1-47 - ConfirmDialog.test.tsx:1-48

结论

这四个通用组件构成了 Vibe-Trading 前端的稳定基石:ErrorBoundary 保障健壮性,Skeleton 提升感知性能,BrandMark 统一品牌表达,ConfirmDialog 强化交互安全。遵循本文的接口规范、可访问性与性能建议,可在业务中高效复用并保持一致体验。

[本节为总结性内容,不直接分析具体文件]

附录

[本节为补充信息,不直接分析具体文件]