500 lines
12 KiB
Markdown
500 lines
12 KiB
Markdown
# ExtendInfoPanel 组件
|
||
|
||
## 组件说明
|
||
|
||
扩展信息面板组件,用于展示多个可折叠的信息区块。支持横向和纵向两种布局模式,每个区块独立管理展开/收起状态,支持自定义图标和内容。适合在页面的扩展信息区(右侧或顶部)使用。
|
||
|
||
> **注意**:该组件由 SideInfoPanel 重命名而来,功能完全兼容。
|
||
|
||
## 组件位置
|
||
|
||
```
|
||
src/components/ExtendInfoPanel/ExtendInfoPanel.jsx
|
||
src/components/ExtendInfoPanel/ExtendInfoPanel.css
|
||
```
|
||
|
||
## 参数说明
|
||
|
||
| 参数名 | 类型 | 必填 | 默认值 | 说明 |
|
||
|--------|------|------|--------|------|
|
||
| sections | Array<SectionConfig> | 否 | [] | 信息区块配置数组 |
|
||
| layout | string | 否 | 'vertical' | 布局方式:'vertical'(垂直堆叠)\| 'horizontal'(水平排列) |
|
||
| className | string | 否 | '' | 自定义类名 |
|
||
|
||
### SectionConfig 配置项
|
||
|
||
| 属性名 | 类型 | 必填 | 说明 |
|
||
|--------|------|------|------|
|
||
| key | string | 是 | 区块唯一标识 |
|
||
| title | string | 是 | 区块标题 |
|
||
| icon | ReactNode | 否 | 标题图标 |
|
||
| content | ReactNode | 是 | 区块内容 |
|
||
| defaultCollapsed | boolean | 否 | 是否默认折叠,默认 false |
|
||
| hideTitleBar | boolean | 否 | 是否隐藏标题栏,默认 false(隐藏后区块内容始终显示) |
|
||
|
||
## 布局模式
|
||
|
||
### 垂直布局(Vertical)
|
||
|
||
区块垂直堆叠排列,适合在右侧信息面板中使用。
|
||
|
||
```
|
||
┌────────────────┐
|
||
│ Section 1 │
|
||
├────────────────┤
|
||
│ Section 2 │
|
||
├────────────────┤
|
||
│ Section 3 │
|
||
└────────────────┘
|
||
```
|
||
|
||
### 水平布局(Horizontal)
|
||
|
||
区块水平排列,适合在顶部扩展面板中使用。
|
||
|
||
```
|
||
┌──────┬──────┬──────┐
|
||
│ Sec1 │ Sec2 │ Sec3 │
|
||
└──────┴──────┴──────┘
|
||
```
|
||
|
||
## 使用示例
|
||
|
||
### 基础用法 - 垂直布局
|
||
|
||
```jsx
|
||
import ExtendInfoPanel from '../components/ExtendInfoPanel/ExtendInfoPanel'
|
||
import { DashboardOutlined } from '@ant-design/icons'
|
||
|
||
function MyPage() {
|
||
return (
|
||
<ExtendInfoPanel
|
||
layout="vertical"
|
||
sections={[
|
||
{
|
||
key: 'overview',
|
||
title: '概览',
|
||
icon: <DashboardOutlined />,
|
||
content: <div>概览内容</div>,
|
||
},
|
||
]}
|
||
/>
|
||
)
|
||
}
|
||
```
|
||
|
||
### 水平布局 - 用于顶部扩展区(隐藏标题栏)
|
||
|
||
```jsx
|
||
<ExtendInfoPanel
|
||
layout="horizontal"
|
||
sections={[
|
||
{
|
||
key: 'stats',
|
||
title: '数据统计',
|
||
hideTitleBar: true, // 隐藏标题栏,内容始终显示
|
||
content: (
|
||
<div className="stat-cards-grid stat-cards-grid-4">
|
||
<StatCard title="总数" value={100} />
|
||
<StatCard title="在线" value={85} />
|
||
<StatCard title="离线" value={10} />
|
||
<StatCard title="错误" value={5} />
|
||
</div>
|
||
),
|
||
},
|
||
]}
|
||
/>
|
||
```
|
||
|
||
### 水平布局 - 多个区块
|
||
|
||
```jsx
|
||
<ExtendInfoPanel
|
||
layout="horizontal"
|
||
sections={[
|
||
{
|
||
key: 'stats',
|
||
title: '数据统计',
|
||
content: (
|
||
<div style={{ display: 'flex', gap: '16px' }}>
|
||
<StatCard title="总数" value={100} />
|
||
<StatCard title="在线" value={85} />
|
||
</div>
|
||
),
|
||
},
|
||
]}
|
||
/>
|
||
```
|
||
|
||
### 多个区块
|
||
|
||
```jsx
|
||
<ExtendInfoPanel
|
||
sections={[
|
||
{
|
||
key: 'info',
|
||
title: '基本信息',
|
||
icon: <InfoCircleOutlined />,
|
||
content: <div>基本信息内容</div>,
|
||
},
|
||
{
|
||
key: 'stats',
|
||
title: '统计数据',
|
||
icon: <BarChartOutlined />,
|
||
content: <div>统计数据内容</div>,
|
||
},
|
||
{
|
||
key: 'logs',
|
||
title: '操作日志',
|
||
icon: <FileTextOutlined />,
|
||
defaultCollapsed: true, // 默认折叠
|
||
content: <div>日志内容</div>,
|
||
},
|
||
]}
|
||
/>
|
||
```
|
||
|
||
### 配合 StatCard 使用
|
||
|
||
```jsx
|
||
import StatCard from '../components/StatCard/StatCard'
|
||
|
||
<ExtendInfoPanel
|
||
sections={[
|
||
{
|
||
key: 'overview',
|
||
title: '概览',
|
||
icon: <DashboardOutlined />,
|
||
content: (
|
||
<div style={{ display: 'grid', gap: '12px' }}>
|
||
<StatCard
|
||
key="total"
|
||
title="镜像总数"
|
||
value={32}
|
||
icon={<DatabaseOutlined />}
|
||
color="blue"
|
||
gridColumn="1 / -1"
|
||
/>
|
||
<StatCard
|
||
key="running"
|
||
title="运行中"
|
||
value={28}
|
||
color="green"
|
||
/>
|
||
<StatCard
|
||
key="stopped"
|
||
title="已停止"
|
||
value={4}
|
||
color="gray"
|
||
/>
|
||
</div>
|
||
),
|
||
},
|
||
]}
|
||
/>
|
||
```
|
||
|
||
### 配合 ChartPanel 使用
|
||
|
||
```jsx
|
||
import ChartPanel from '../components/ChartPanel/ChartPanel'
|
||
|
||
<ExtendInfoPanel
|
||
sections={[
|
||
{
|
||
key: 'charts',
|
||
title: '数据可视化',
|
||
icon: <LineChartOutlined />,
|
||
content: (
|
||
<>
|
||
<ChartPanel
|
||
key="cpu"
|
||
type="line"
|
||
title="CPU使用率趋势"
|
||
data={cpuData}
|
||
height={180}
|
||
/>
|
||
<ChartPanel
|
||
key="memory"
|
||
type="line"
|
||
title="内存使用率趋势"
|
||
data={memoryData}
|
||
height={180}
|
||
/>
|
||
</>
|
||
),
|
||
},
|
||
]}
|
||
/>
|
||
```
|
||
|
||
### 完整示例 - 配合 SplitLayout
|
||
|
||
#### 横向布局(右侧扩展区)
|
||
|
||
```jsx
|
||
import SplitLayout from '../components/SplitLayout/SplitLayout'
|
||
import ExtendInfoPanel from '../components/ExtendInfoPanel/ExtendInfoPanel'
|
||
|
||
<SplitLayout
|
||
direction="horizontal"
|
||
mainContent={
|
||
<>
|
||
<ListActionBar ... />
|
||
<ListTable ... />
|
||
</>
|
||
}
|
||
extendContent={
|
||
<ExtendInfoPanel
|
||
layout="vertical" // 区块垂直堆叠
|
||
sections={[
|
||
{
|
||
key: 'overview',
|
||
title: '概览',
|
||
icon: <DashboardOutlined />,
|
||
content: <StatCards />
|
||
},
|
||
{
|
||
key: 'monitor',
|
||
title: '性能监控',
|
||
icon: <LineChartOutlined />,
|
||
content: <Charts />
|
||
}
|
||
]}
|
||
/>
|
||
}
|
||
/>
|
||
```
|
||
|
||
#### 纵向布局(顶部扩展区)
|
||
|
||
```jsx
|
||
import { useState } from 'react'
|
||
import PageTitleBar from '../components/PageTitleBar/PageTitleBar'
|
||
import SplitLayout from '../components/SplitLayout/SplitLayout'
|
||
import ExtendInfoPanel from '../components/ExtendInfoPanel/ExtendInfoPanel'
|
||
|
||
function UserListPage() {
|
||
const [showStats, setShowStats] = useState(false)
|
||
|
||
return (
|
||
<>
|
||
<PageTitleBar
|
||
title="用户列表"
|
||
showToggle={true}
|
||
onToggle={setShowStats}
|
||
/>
|
||
|
||
<SplitLayout
|
||
direction="vertical"
|
||
mainContent={
|
||
<>
|
||
<ListActionBar ... />
|
||
<ListTable ... />
|
||
</>
|
||
}
|
||
extendContent={
|
||
<ExtendInfoPanel
|
||
layout="horizontal" // 区块水平排列
|
||
sections={[
|
||
{
|
||
key: 'stats',
|
||
title: '数据统计',
|
||
content: (
|
||
<div style={{ display: 'flex', gap: '16px' }}>
|
||
<StatCard title="总用户数" value={100} />
|
||
<StatCard title="启用" value={85} color="green" />
|
||
<StatCard title="停用" value={15} color="gray" />
|
||
<StatCard title="筛选结果" value={85} color="orange" />
|
||
</div>
|
||
)
|
||
}
|
||
]}
|
||
/>
|
||
}
|
||
showExtend={showStats}
|
||
/>
|
||
</>
|
||
)
|
||
}
|
||
```
|
||
|
||
## 布局结构
|
||
|
||
### DOM 结构层级
|
||
|
||
#### 垂直布局
|
||
|
||
```html
|
||
<div class="extend-info-panel extend-info-panel-vertical">
|
||
|
||
<!-- 信息区块 1 -->
|
||
<div class="extend-info-section">
|
||
<!-- 区块头部(可点击) -->
|
||
<div class="extend-info-section-header" onClick={toggleSection}>
|
||
<div class="extend-info-section-title">
|
||
<span class="extend-info-section-icon">{icon}</span>
|
||
<span>{title}</span>
|
||
</div>
|
||
<button class="extend-info-section-toggle">
|
||
{isCollapsed ? <DownOutlined /> : <UpOutlined />}
|
||
</button>
|
||
</div>
|
||
|
||
<!-- 区块内容(折叠时隐藏) -->
|
||
{!isCollapsed && (
|
||
<div class="extend-info-section-content">
|
||
{content}
|
||
</div>
|
||
)}
|
||
</div>
|
||
|
||
<!-- 更多区块... -->
|
||
|
||
</div>
|
||
```
|
||
|
||
#### 水平布局
|
||
|
||
```html
|
||
<div class="extend-info-panel extend-info-panel-horizontal">
|
||
<div class="extend-info-section">...</div>
|
||
<div class="extend-info-section">...</div>
|
||
<div class="extend-info-section">...</div>
|
||
</div>
|
||
```
|
||
|
||
## 样式定制
|
||
|
||
组件提供以下 CSS 类名供自定义样式:
|
||
|
||
- `.extend-info-panel` - 面板容器
|
||
- `.extend-info-panel-vertical` - 垂直布局模式
|
||
- `.extend-info-panel-horizontal` - 水平布局模式
|
||
- `.extend-info-section` - 单个信息区块
|
||
- `.extend-info-section-header` - 区块头部
|
||
- `.extend-info-section-title` - 区块标题
|
||
- `.extend-info-section-icon` - 标题图标
|
||
- `.extend-info-section-toggle` - 折叠按钮
|
||
- `.extend-info-section-content` - 区块内容
|
||
|
||
### 自定义样式示例
|
||
|
||
```css
|
||
/* 修改区块间距 */
|
||
.extend-info-panel-vertical {
|
||
gap: 20px;
|
||
}
|
||
|
||
/* 自定义区块头部背景 */
|
||
.extend-info-section-header {
|
||
background: linear-gradient(135deg, #f0f7ff 0%, #e8f4ff 100%);
|
||
}
|
||
|
||
/* 修改水平布局的区块宽度 */
|
||
.extend-info-panel-horizontal .extend-info-section {
|
||
flex: 1;
|
||
min-width: 300px;
|
||
}
|
||
```
|
||
|
||
## 使用场景
|
||
|
||
### 1. 右侧信息面板(垂直布局)
|
||
|
||
- **系统监控面板**:展示系统状态、性能指标、告警信息
|
||
- **数据分析侧边栏**:展示统计数据、图表、筛选器
|
||
- **详情页辅助信息**:展示相关数据、操作历史、关联信息
|
||
|
||
### 2. 顶部扩展面板(水平布局)
|
||
|
||
- **统计数据面板**:展示多个统计卡片
|
||
- **快捷操作区**:展示常用操作和快捷入口
|
||
- **筛选条件区**:展示可展开的筛选条件
|
||
|
||
## 注意事项
|
||
|
||
### 1. 布局选择
|
||
|
||
```jsx
|
||
// ✅ 右侧扩展区使用垂直布局
|
||
<SplitLayout direction="horizontal">
|
||
<ExtendInfoPanel layout="vertical" />
|
||
</SplitLayout>
|
||
|
||
// ✅ 顶部扩展区使用水平布局
|
||
<SplitLayout direction="vertical">
|
||
<ExtendInfoPanel layout="horizontal" />
|
||
</SplitLayout>
|
||
|
||
// ❌ 避免:右侧扩展区使用水平布局(宽度不够)
|
||
<SplitLayout direction="horizontal">
|
||
<ExtendInfoPanel layout="horizontal" />
|
||
</SplitLayout>
|
||
```
|
||
|
||
### 2. 区块数量
|
||
|
||
- **垂直布局**:建议 2-4 个区块,过多影响用户体验
|
||
- **水平布局**:建议 1-4 个区块,根据容器宽度调整
|
||
|
||
### 3. 折叠状态
|
||
|
||
- 区块的折叠状态由组件内部管理,外部无法直接控制
|
||
- 可通过 `defaultCollapsed` 设置初始状态
|
||
- 建议将不常用的区块设为默认折叠
|
||
|
||
### 4. 内容高度
|
||
|
||
- **垂直布局**:区块内容高度不限,但建议单个区块不要过长(建议 < 500px)
|
||
- **水平布局**:建议控制区块内容高度一致,保持视觉整齐
|
||
|
||
### 5. 图标使用
|
||
|
||
- 建议为每个区块添加图标,提升视觉识别度
|
||
- 图标应与区块内容相关
|
||
- 使用 Ant Design 图标库保持风格统一
|
||
|
||
### 6. 宽度适配
|
||
|
||
- **垂直布局**:组件自适应父容器宽度,建议在 320-400px 容器中使用
|
||
- **水平布局**:组件占满父容器宽度,区块平均分配或根据内容自适应
|
||
|
||
## 迁移指南
|
||
|
||
### 从 SideInfoPanel 迁移
|
||
|
||
组件功能完全兼容,只需更改导入路径和组件名:
|
||
|
||
**旧代码**:
|
||
```jsx
|
||
import SideInfoPanel from '../components/SideInfoPanel/SideInfoPanel'
|
||
|
||
<SideInfoPanel sections={[...]} />
|
||
```
|
||
|
||
**新代码**:
|
||
```jsx
|
||
import ExtendInfoPanel from '../components/ExtendInfoPanel/ExtendInfoPanel'
|
||
|
||
<ExtendInfoPanel sections={[...]} />
|
||
```
|
||
|
||
**新增参数**:
|
||
- `layout` - 布局模式(新增),默认 'vertical'
|
||
|
||
## 配合使用的组件
|
||
|
||
- **SplitLayout** - 布局容器(必需)
|
||
- **StatCard** - 统计卡片(推荐)
|
||
- **ChartPanel** - 图表面板(推荐)
|
||
- **InfoPanel** - 信息展示面板
|
||
- **PageTitleBar** - 页面标题栏(配合纵向布局)
|
||
|
||
## 相关文档
|
||
|
||
- [主内容区布局](../layouts/content-area-layout.md) - 详细的布局使用指南
|
||
- [SplitLayout](./SplitLayout.md) - 布局容器组件
|
||
- [StatCard](./StatCard.md) - 统计卡片组件
|
||
- [ChartPanel](./ChartPanel.md) - 图表面板组件
|