bricks/docs/cn.old/echartsext.md
2025-11-19 12:30:39 +08:00

301 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `EchartsExt` 技术文档
> **模块路径**: `bricks.EchartsExt`
> **继承自**: `bricks.VBox`
> **依赖库**: [Apache ECharts](https://echarts.apache.org/)(需全局引入)
---
## 概述
`bricks.EchartsExt` 是一个基于 `ECharts` 的可扩展图表组件,封装在 `bricks.js` 前端框架中。它继承自 `VBox` 容器类,支持动态数据加载、响应式布局以及点击事件处理,适用于展示多维数据的可视化图表(如柱状图、折线图、饼图等)。
该组件支持从本地数据或远程 URL 加载数据,并能自动将“长格式”数据透视为“宽格式”,便于多系列图表渲染。
---
## 初始化选项Constructor Options
```js
new bricks.EchartsExt({
title: String, // 图表标题
description: String, // 图表描述(可选)
data_url: String, // 远程数据接口地址
data_params: Object, // 请求参数(附加到 data_url
method: String, // HTTP 方法,默认 'GET'
user_data: Array, // 本地数据数组(优先级高于 data_url
nameField: String, // 分组字段名(如:类别名称),默认 'name'
valueField: String, // 数值字段名(单系列时使用),默认 'value'
serieField: String, // 系列字段名(用于区分多个数据系列)
valueFields: Array, // 多数值字段数组(若未设置,则根据 serieField 自动提取)
pie_options: Object, // 特定于饼图的配置项(可选)
idField: String // 唯一标识字段,默认 'id'
})
```
> ⚠️ 注意:`user_data` 和 `data_url` 二选一。若两者都存在,优先使用 `user_data`。
---
## 属性说明
| 属性 | 类型 | 描述 |
|------|------|------|
| `idField` | String | 数据对象唯一标识字段,默认 `'id'` |
| `nameField` | String | 作为 X 轴或分类维度的字段,默认 `'name'` |
| `valueField` | String | 主数值字段,默认 `'value'`(仅单系列有效) |
| `serieField` | String | 区分不同数据系列的字段(例如:“类型”、“年份”) |
| `valueFields` | Array | 所有需要显示的数据系列名称列表(自动从 `serieField` 提取) |
| `user_data` | Array | 当前加载的数据集(原始格式) |
| `data_url` | String | 数据请求地址 |
| `data_params` | Object | 额外请求参数 |
| `holder` | `bricks.Filler` | 内部占位容器,用于承载 ECharts 实例 |
| `chart` | `echarts.ECharts` | ECharts 实例对象 |
| `method` | String | HTTP 请求方法,默认 `'GET'` |
---
## 方法详解
### `constructor(opts)`
初始化图表组件,执行以下操作:
- 设置默认字段;
- 创建标题和描述组件;
- 初始化内部容器 `holder`
- 初始化 ECharts 实例;
- 若存在 `user_data` 则立即渲染;否则尝试通过 `data_url` 异步加载数据;
- 绑定窗口/元素重绘事件以触发图表 resize。
```js
this.bind('element_resize', this.chart.resize.bind(this.chart));
```
---
### `pivotify(data) → Array`
将“长格式”数据转换为“宽格式”数据,便于多系列图表展示。
#### 输入数据示例(长格式):
```json
[
{ "name": "A", "type": "销量", "value": 100 },
{ "name": "A", "type": "利润", "value": 30 },
{ "name": "B", "type": "销量", "value": 150 }
]
```
#### 输出结果(宽格式):
```json
[
{ "name": "A", "销量": 100, "利润": 30 },
{ "name": "B", "销量": 150 }
]
```
#### 处理逻辑:
1. 提取所有唯一的 `serieField` 值作为新字段;
2.`nameField` 排序;
3. 构建以 `nameField` 为键的对象字典;
4. 将每个记录映射到对应行并填充相应系列值;
5. 返回对象值数组并排序。
> ✅ 使用场景:当 `serieField` 存在时,自动启用透视功能。
---
### `get_series(data) → Array`
提取数据中所有唯一的系列名称(基于 `this.serieField`)。
#### 示例:
```js
data = [
{ type: 'sales', value: 100 },
{ type: 'profit', value: 20 },
{ type: 'sales', value: 80 }
]
// get_series(data) → ['sales', 'profit']
```
返回值用于生成图例legend或系列配置。
---
### `render_data()`
根据当前 `user_data` 渲染图表。
#### 步骤:
1. 若存在 `serieField`,则调用 `pivotify()` 转换数据;
2. 初始化新的 ECharts 实例(防止内存泄漏);
3. 调用 `setup_options(data)` 获取图表配置;
4. 补充 `grid` 布局配置;
5. 若有多系列且存在 `legend`,更新其 `data` 字段;
6. 应用配置到 ECharts 实例;
7. 绑定点击事件处理器 `click_handle`
> 🔁 支持热更新:每次调用此方法都会重新绘制图表。
---
### `click_handle(params)`
ECharts 点击事件回调函数。
#### 参数:
- `params`: ECharts 返回的点击事件参数对象
#### 动作:
- 打印调试信息至控制台;
- 触发自定义事件 `'element_click'`,携带原始数据项:
```js
this.dispatch('element_click', this.user_data[params.dataIndex]);
```
> 🎯 可用于外部监听数据项点击行为,实现联动交互。
---
### `async render_urldata(params = {})`
异步从远程 URL 加载数据并渲染图表。
#### 流程:
1. 合并默认参数 `this.data_params` 与传入参数;
2. 使用 `bricks.HttpJson` 发起 HTTP 请求;
3. 成功后保存响应数据至 `this.user_data`
4. 调用 `render_data()` 渲染图表。
#### 示例请求:
```js
await jc.httpcall(this.data_url, {
method: this.method || 'GET',
params: _params
});
```
> ⏱️ 默认延迟 0.1 秒调度,避免构造期间 DOM 未就绪。
---
## 事件Events
| 事件名 | 触发时机 | 携带数据 |
|--------|----------|---------|
| `element_click` | 用户点击图表中的某个数据点 | 对应的原始数据项(来自 `user_data` |
| `element_resize` | 元素尺寸变化时(由父容器触发) | —— |
可通过 `bind()` 监听这些事件:
```js
chart.bind('element_click', function(dataItem) {
console.log('Clicked:', dataItem);
});
```
---
## 数据结构要求
### 本地数据(`user_data`)格式
```json
[
{
"name": "类别A",
"value": 120,
"type": "线上"
},
{
"name": "类别A",
"value": 80,
"type": "线下"
},
...
]
```
- 必须是对象数组;
- 至少包含 `nameField``valueField` 字段;
- 若使用多系列,需提供 `serieField` 字段。
---
## 样式与布局
- 图表容器自动适应父元素大小;
- `grid` 配置留白 3%,确保标签不被裁剪;
- 支持响应式设计,绑定 `element_resize` 事件自动调整图表尺寸。
---
## 使用示例
### 示例 1使用本地数据创建多系列柱状图
```js
var chart = new bricks.EchartsExt({
title: "销售统计",
description: "各区域线上线下销售额对比",
user_data: [
{ name: "北京", type: "线上", value: 200 },
{ name: "北京", type: "线下", value: 150 },
{ name: "上海", type: "线上", value: 180 },
{ name: "上海", type: "线下", value: 170 }
],
nameField: "name",
valueField: "value",
serieField: "type"
});
chart.bind('element_click', function(item) {
alert("点击了:" + item.name);
});
```
### 示例 2从 API 加载数据
```js
var chart = new bricks.EchartsExt({
title: "实时订单量",
data_url: "/api/orders",
data_params: { period: "today" },
nameField: "hour",
valueField: "count",
method: "GET"
});
```
---
## 注意事项
1. **ECharts 必须已全局加载**,否则 `echarts.init` 会报错;
2. `setup_options(data)` 方法需子类实现,用于定义具体图表类型(如 bar、line、pie
3. 若未定义 `serieField`,则不会进行数据透视;
4. `valueFields` 若手动指定,则忽略自动提取逻辑;
5. 建议对大数据集做分页或聚合处理,避免性能问题。
---
## 调试提示
- 查看浏览器控制台输出 `opts=` 可检查最终传递给 ECharts 的配置;
- 确保 `this.holder.dom_element` 已正确挂载且非空;
- 检查网络请求是否成功返回合法 JSON 数据。
---
## 版本信息
- **Bricks Framework**: v1.x+
- **ECharts 支持版本**: ≥ 5.0
- **兼容性**: 支持现代浏览器Chrome / Firefox / Edge / Safari
---
> 💡 提示:建议结合 `bricks.Layout` 系统使用,实现复杂仪表盘布局。