From fb1f5e10db9ac67e65328e198cd37208b0036f7e Mon Sep 17 00:00:00 2001 From: zdl <3489966805@qq.com> Date: Thu, 30 Oct 2025 12:19:37 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=20EventList.js=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 196 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c093980e..7ff19cea 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,198 @@ # vf_react -前端 \ No newline at end of file +前端 + +--- + +## 📚 重构记录 + +### 2025-10-30: EventList.js 组件化重构 + +#### 🎯 重构目标 +将 Community 社区页面的 `EventList.js` 组件(1095行)拆分为多个可复用的子组件,提高代码可维护性和复用性。 + +#### 📊 重构成果 +- **重构前**: 1095 行 +- **重构后**: 497 行 +- **减少**: 598 行 (-54.6%) + +--- + +### 📁 新增目录结构 + +``` +src/views/Community/components/EventCard/ +├── index.js (60行) - EventCard 统一入口,智能路由紧凑/详细模式 +│ +├── ────────────────────────────────────────────────────────── +│ 原子组件 (Atoms) - 7个基础UI组件 +├── ────────────────────────────────────────────────────────── +│ +├── EventTimeline.js (60行) - 时间轴显示组件 +│ └── Props: createdAt, timelineStyle, borderColor, minHeight +│ +├── EventImportanceBadge.js (100行) - 重要性等级标签 (S/A/B/C/D) +│ └── Props: importance, showTooltip, showIcon, size +│ +├── EventStats.js (60行) - 统计信息 (浏览/帖子/关注) +│ └── Props: viewCount, postCount, followerCount, size, spacing +│ +├── EventFollowButton.js (40行) - 关注按钮 +│ └── Props: isFollowing, followerCount, onToggle, size, showCount +│ +├── EventPriceDisplay.js (130行) - 价格变动显示 (平均/最大/周) +│ └── Props: avgChange, maxChange, weekChange, compact, inline +│ +├── EventDescription.js (60行) - 描述文本 (支持展开/收起) +│ └── Props: description, textColor, minLength, noOfLines +│ +├── EventHeader.js (100行) - 事件标题头部 +│ └── Props: title, importance, onTitleClick, linkColor, compact +│ +├── ────────────────────────────────────────────────────────── +│ 组合组件 (Molecules) - 2个卡片组件 +├── ────────────────────────────────────────────────────────── +│ +├── CompactEventCard.js (160行) - 紧凑模式事件卡片 +│ ├── 使用: EventTimeline, EventHeader, EventStats, EventFollowButton +│ └── Props: event, index, isFollowing, followerCount, callbacks... +│ +└── DetailedEventCard.js (170行) - 详细模式事件卡片 + ├── 使用: EventTimeline, EventHeader, EventStats, EventFollowButton, + │ EventPriceDisplay, EventDescription + └── Props: event, isFollowing, followerCount, callbacks... +``` + +**总计**: 10个文件,940行代码 + +--- + +### 🔧 重构的文件 + +#### `src/views/Community/components/EventList.js` + +**移除的内容**: +- ❌ `renderPriceChange` 函数 (~60行) +- ❌ `renderCompactEvent` 函数 (~200行) +- ❌ `renderDetailedEvent` 函数 (~300行) +- ❌ `expandedDescriptions` state(展开状态管理移至子组件) +- ❌ 冗余的 Chakra UI 导入 + +**保留的功能**: +- ✅ WebSocket 实时推送 +- ✅ 浏览器原生通知 +- ✅ 关注状态管理 (followingMap, followCountMap) +- ✅ 分页控制 +- ✅ 视图模式切换(紧凑/详细) +- ✅ 推送权限管理 + +**新增引入**: +```javascript +import EventCard from './EventCard'; +``` + +--- + +### 🏗️ 架构改进 + +#### 重构前(单体架构) +``` +EventList.js (1095行) +├── 业务逻辑 (WebSocket, 关注, 通知) +├── renderCompactEvent (200行) +│ └── 所有UI代码内联 +├── renderDetailedEvent (300行) +│ └── 所有UI代码内联 +└── renderPriceChange (60行) +``` + +#### 重构后(组件化架构) +``` +EventList.js (497行) - 容器组件 +├── 业务逻辑 (WebSocket, 关注, 通知) +└── 渲染逻辑 + └── EventCard (智能路由) + ├── CompactEventCard (紧凑模式) + │ ├── EventTimeline + │ ├── EventHeader (compact) + │ ├── EventStats + │ └── EventFollowButton + └── DetailedEventCard (详细模式) + ├── EventTimeline + ├── EventHeader (detailed) + ├── EventStats + ├── EventFollowButton + ├── EventPriceDisplay + └── EventDescription +``` + +--- + +### ✨ 优势 + +1. **可维护性** ⬆️ + - 每个组件职责单一(单一职责原则) + - 代码行数减少 54.6% + - 组件边界清晰,易于理解 + +2. **可复用性** ⬆️ + - 原子组件可在其他页面复用 + - 例如:EventImportanceBadge 可用于任何需要显示事件等级的地方 + +3. **可测试性** ⬆️ + - 小组件更容易编写单元测试 + - 可独立测试每个组件的渲染和交互 + +4. **性能优化** ⬆️ + - React 可以更精确地追踪变化 + - 减少不必要的重渲染 + - 每个子组件可独立优化(useMemo, React.memo) + +5. **开发效率** ⬆️ + - 新增功能时只需修改对应的子组件 + - 代码审查更高效 + - 降低了代码冲突的概率 + +--- + +### 📦 依赖工具函数 + +本次重构使用了之前提取的工具函数: + +``` +src/utils/priceFormatters.js (105行) +├── getPriceChangeColor(value) - 获取价格变化文字颜色 +├── getPriceChangeBg(value) - 获取价格变化背景颜色 +├── getPriceChangeBorderColor(value) - 获取价格变化边框颜色 +├── formatPriceChange(value) - 格式化价格为字符串 +└── PriceArrow({ value }) - 价格涨跌箭头组件 + +src/constants/animations.js (72行) +├── pulseAnimation - 脉冲动画(S/A级标签) +├── fadeIn - 渐入动画 +├── slideInUp - 从下往上滑入 +├── scaleIn - 缩放进入 +└── spin - 旋转动画(Loading) +``` + +--- + +### 🚀 下一步优化计划 + +Phase 1 已完成,后续可继续优化: + +- **Phase 2**: 拆分 StockDetailPanel.js (1067行 → ~250行) +- **Phase 3**: 拆分 InvestmentCalendar.js (827行 → ~200行) +- **Phase 4**: 拆分 MidjourneyHeroSection.js (813行 → ~200行) +- **Phase 5**: 拆分 UnifiedSearchBox.js (679行 → ~180行) + +--- + +### 🔗 相关提交 + +- `feat: 拆分 EventList.js/提取价格相关工具函数到 utils/priceFormatters.js` +- `feat(EventList): 创建事件卡片原子组件` +- `feat(EventList): 创建事件卡片组合组件` +- `refactor(EventList): 使用组件化架构替换内联渲染函数` + +--- \ No newline at end of file