布局组件

📎 引用文件

本文引用的文件 - Layout.tsx - ConnectionBanner.tsx - router.tsx - main.tsx - useSSE.ts - agent.ts - useDarkMode.ts - theme-store.ts - storage.ts - Layout.test.tsx - ConnectionBanner.test.tsx

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与内存优化
  8. 故障排查指南
  9. 结论
  10. 附录:定制与扩展指南

简介

本文件聚焦 Vibe-Trading 前端应用的布局层,系统性说明主布局组件 Layout 的响应式实现、页面结构与路由集成;连接状态横幅 ConnectionBanner 的网络状态检测、用户提示与自动重连机制;以及布局的状态管理、移动端适配、主题切换、国际化语言切换等能力。同时给出性能优化建议、内存管理与浏览器兼容性注意事项,并提供可操作的定制与扩展示例路径。

项目结构

布局相关代码位于 frontend/src/components/layout,配合路由配置与全局入口完成整体装配。

graph TB A["main.tsx<br/>应用入口"] --> B["router.tsx<br/>路由定义"] B --> C["Layout.tsx<br/>主布局组件"] C --> D["ConnectionBanner.tsx<br/>连接状态横幅"] C --> E["useDarkMode.ts<br/>深色模式 Hook"] C --> F["agent.ts<br/>Zustand 状态SSE 状态"] C --> G["useSSE.ts<br/>SSE 连接与重连"] C --> H["storage.ts<br/>安全存储封装"] C --> I["theme-store.ts<br/>主题变更广播"]

图表来源 - main.tsx:28-35 - router.tsx:48-67 - Layout.tsx:17-315 - ConnectionBanner.tsx:10-43 - useDarkMode.ts:23-79 - agent.ts:60-114 - useSSE.ts:27-215 - storage.ts:7-29 - theme-store.ts:10-27

章节来源 - main.tsx:1-36 - router.tsx:1-69

核心组件

章节来源 - Layout.tsx:17-315 - ConnectionBanner.tsx:10-43

架构总览

布局通过路由包裹所有页面,使用 Zustand 订阅 SSE 连接状态,结合 useSSE 的重连策略驱动横幅显示。主题与语言切换由独立模块负责,并通过事件或外部存储跨组件同步。

sequenceDiagram participant U as "用户" participant R as "RouterProvider" participant L as "Layout" participant S as "AgentStore(SSE)" participant B as "ConnectionBanner" participant H as "useSSE" U->>R : 访问应用 R->>L : 渲染 <Layout /> L->>S : 读取 sseStatus / sseRetryAttempt S-->>L : 返回当前连接状态 L->>B : 传入状态并渲染横幅 H-->>S : 更新 sseStatus(connected/reconnecting/disconnected) B-->>U : 显示“重连中”或“已断开+刷新”

图表来源 - main.tsx:28-35 - router.tsx:48-67 - Layout.tsx:306-312 - agent.ts:76-108 - useSSE.ts:158-174 - ConnectionBanner.tsx:10-43

详细组件分析

主布局 Layout

flowchart TD Start(["进入 Layout"]) --> Nav["渲染侧边栏导航"] Nav --> Sessions{"是否展开?"} Sessions -- 否 --> Footer["页脚:主题/语言/折叠"] Sessions -- 是 --> List["会话列表:加载/新增/重命名/删除"] List --> Footer Footer --> Main["主区域:连接横幅 + Outlet"] Main --> End(["渲染完成"])

图表来源 - Layout.tsx:97-315

章节来源 - Layout.tsx:17-315 - Layout.test.tsx:88-147

连接状态横幅 ConnectionBanner

flowchart TD In(["接收 status, retryAttempt"]) --> Check{"status == reconnecting?"} Check -- 否 --> Hide["不渲染"] Check -- 是 --> Threshold{"retryAttempt >= 5?"} Threshold -- 否 --> ShowReconnect["显示‘重连中’+旋转图标"] Threshold -- 是 --> ShowTerminal["显示‘已断开’+刷新按钮"] ShowReconnect --> End(["结束"]) ShowTerminal --> End Hide --> End

图表来源 - ConnectionBanner.tsx:10-43 - useSSE.ts:158-174

章节来源 - ConnectionBanner.tsx:10-43 - ConnectionBanner.test.tsx:5-51

状态管理与 SSE 集成

classDiagram class AgentStore { +sseStatus +sseRetryAttempt +setSseStatus() } class UseSSE { +connect() +disconnect() +getStatus() +onStatusChange() } class Layout { +读取 sseStatus +渲染 ConnectionBanner } class ConnectionBanner { +根据 status 渲染 } Layout --> AgentStore : "订阅状态" UseSSE --> AgentStore : "更新状态" Layout --> ConnectionBanner : "传递状态"

图表来源 - agent.ts:60-114 - useSSE.ts:27-215 - Layout.tsx:306-312 - ConnectionBanner.tsx:10-43

章节来源 - agent.ts:60-114 - useSSE.ts:27-215

主题切换与国际化

章节来源 - useDarkMode.ts:23-79 - theme-store.ts:10-27 - Layout.tsx:317-458

依赖关系分析

graph LR M["main.tsx"] --> RT["router.tsx"] RT --> L["Layout.tsx"] L --> CB["ConnectionBanner.tsx"] L --> AG["agent.ts"] L --> DM["useDarkMode.ts"] DM --> TS["theme-store.ts"] L --> ST["storage.ts"]

图表来源 - main.tsx:28-35 - router.tsx:48-67 - Layout.tsx:17-315 - ConnectionBanner.tsx:10-43 - useDarkMode.ts:23-79 - theme-store.ts:10-27 - storage.ts:7-29

章节来源 - router.tsx:1-69 - main.tsx:1-36

性能与内存优化

章节来源 - router.tsx:5-30 - main.tsx:11-26 - useSSE.ts:40-56 - storage.ts:1-29 - theme-store.ts:10-27

故障排查指南

章节来源 - ConnectionBanner.tsx:10-43 - useSSE.ts:158-174 - theme-store.ts:10-27 - storage.ts:1-29

结论

Layout 与 ConnectionBanner 共同构成了 Vibe-Trading 的前端布局基座:前者提供响应式导航、会话管理与主题/语言切换,后者保障连接状态的可视化与容错体验。借助 Zustand 与 useSSE 的组合,系统在弱网环境下具备稳健的重连与续传能力;通过懒加载、预取与安全存储等手段,兼顾性能与鲁棒性。

附录:定制与扩展指南