@fle-ui/plus-goods-detail-drawer
Version:
@fle-ui/plus-goods-detail-drawer
111 lines (88 loc) • 3.72 kB
Markdown
# Goods Detail Drawer 商品详情抽屉组件
## 组件拆分优化说明
### 🎯 优化目标
将原本1863行的庞大组件拆分为多个功能独立的小组件,提高代码可维护性和复用性。
### 📁 新的文件结构
```
src/
├── components/ # 拆分后的子组件
│ ├── SalesTypeSection/ # 销售类型组件
│ │ └── index.tsx
│ ├── BasicInfoSection/ # 基本信息组件
│ │ └── index.tsx
│ ├── SalesInfoSection/ # 销售信息组件
│ │ └── index.tsx
│ ├── LogisticsInfoSection/ # 物流信息组件
│ │ └── index.tsx
│ ├── GoodsDetailSection/ # 商品详情组件
│ │ └── index.tsx
│ ├── AnchorNavigation/ # 锚点导航组件
│ │ └── index.tsx
│ ├── GoodsDetailSkeleton/ # 骨架屏组件
│ │ └── index.tsx
│ ├── DescriptionsItem/ # 描述项格式化组件
│ │ └── index.tsx
│ └── index.ts # 组件统一导出
├── index.tsx # 主组件(简化后)
├── type.ts # 类型定义
└── tools.ts # 工具函数
```
### 🔧 拆分详情
#### 1. **SalesTypeSection** - 销售类型组件
- **功能**: 展示商品的销售类型(一件代发/集采批发)
- **职责**: 销售类型的显示和变更记录对比
- **行数**: 约50行
#### 2. **BasicInfoSection** - 基本信息组件
- **功能**: 展示商品的基本信息(名称、描述、图片、视频等)
- **职责**: 基础信息的展示、视频预览、SKU表格
- **行数**: 约300行
#### 3. **SalesInfoSection** - 销售信息组件
- **功能**: 展示销售相关信息(价格、库存、样品等)
- **职责**: 价格信息、库存信息、样品信息的展示
- **行数**: 约700行
#### 4. **LogisticsInfoSection** - 物流信息组件
- **功能**: 展示物流相关信息(运费模板、配送规则等)
- **职责**: 运费信息的展示和对比
- **行数**: 约100行
#### 5. **GoodsDetailSection** - 商品详情组件
- **功能**: 展示商品详情和素材
- **职责**: 商品详情HTML渲染、素材文件展示
- **行数**: 约80行
#### 6. **AnchorNavigation** - 锚点导航组件
- **功能**: 提供页面内导航
- **职责**: 锚点导航的渲染和交互
- **行数**: 约60行
#### 7. **GoodsDetailSkeleton** - 骨架屏组件
- **功能**: 加载状态的骨架屏
- **职责**: 加载时的占位显示
- **行数**: 约10行
### 🛠 组件抽取
#### **DescriptionsItem** - 描述项格式化组件
- **位置**: `components/DescriptionsItem/index.tsx`
- **功能**: 统一处理描述项的格式化,包括变更记录的显示
- **复用**: 所有子组件都可以使用
### ✅ 优化效果
#### **代码可维护性**
- 主组件从1863行减少到约300行
- 每个子组件职责单一,易于理解和修改
- 组件间耦合度低,独立性强
#### **代码复用性**
- 子组件可以在其他场景中复用
- 组件函数统一管理,避免重复代码
- 类型定义清晰,便于扩展
#### **开发体验**
- 文件结构清晰,易于定位问题
- 组件拆分后,修改某个功能时只需要关注对应组件
- 测试更容易进行,可以针对单个组件进行测试
### 🔄 使用方式
拆分后的使用方式保持不变:
```tsx
import GoodsDetailDrawer from '@fle-ui-plus/goods-detail-drawer';
// 使用方式完全一致
<GoodsDetailDrawer
open={open}
onClose={onClose}
request={request}
type="detail"
/>
```