179 lines
4.9 KiB
Markdown
179 lines
4.9 KiB
Markdown
# cxc-szcx-lineChart
|
||
# # `line-chart.vue` 组件说明书
|
||
|
||
## 一、组件概述
|
||
`line-chart.vue` 是一个基于 ECharts 实现的折线图组件,用于在 UniApp 项目中展示数据的折线图。该组件接收一系列数据和配置参数,支持动态更新数据,并展示参考线。
|
||
|
||
## 二、组件依赖
|
||
- **Vue 3**:使用 Vue 3 的组合式 API 进行开发。
|
||
- **ECharts**:用于绘制折线图。
|
||
- **`lime-echart`**:UniApp 插件,提供 ECharts 的渲染支持。
|
||
|
||
## 三、组件使用方法
|
||
|
||
### 1. 引入组件
|
||
在需要使用该组件的页面中引入 `line-chart.vue` 组件。
|
||
```vue
|
||
<template>
|
||
<view>
|
||
<line-chart
|
||
:dataList="dataList"
|
||
:xField="xField"
|
||
:yField="yField"
|
||
:legendField="legendField"
|
||
:referenceValue="referenceValue"
|
||
/>
|
||
</view>
|
||
</template>
|
||
|
||
<script setup>
|
||
import LineChart from '@/components/line-chart.vue';
|
||
|
||
const dataList = [
|
||
{ date: '2023-01-01', value: 10, category: 'A' },
|
||
// 更多数据...
|
||
];
|
||
const xField = 'date';
|
||
const yField = 'value';
|
||
const legendField = 'category';
|
||
const referenceValue = 15;
|
||
</script>
|
||
```
|
||
|
||
### 2. 组件属性
|
||
|
||
| 属性名 | 类型 | 默认值 | 描述 |
|
||
| ---- | ---- | ---- | ---- |
|
||
| `dataList` | `Object` | `[]` | 包含图表数据的数组,每个元素是一个对象,包含 `xField`、`yField` 和 `legendField` 对应的数据。 |
|
||
| `xField` | `String` | `''` | 数据中用于表示 x 轴的字段名。 |
|
||
| `yField` | `String` | `''` | 数据中用于表示 y 轴的字段名。 |
|
||
| `legendField` | `String` | `''` | 数据中用于表示图例的字段名。 |
|
||
| `referenceValue` | `Number` | `10` | 图表中参考线的数值。 |
|
||
|
||
## 四、组件内部实现
|
||
|
||
### 1. 模板部分
|
||
```vue
|
||
<template>
|
||
<view class="chart-container">
|
||
<l-echart ref="chart" @init="initChart"></l-echart>
|
||
</view>
|
||
</template>
|
||
```
|
||
- 使用 `l-echart` 组件渲染图表,通过 `ref` 绑定到 `chart`,并在初始化完成时调用 `initChart` 方法。
|
||
|
||
### 2. 脚本部分
|
||
|
||
#### 2.1 引入必要的模块
|
||
```javascript
|
||
import { ref, watch } from 'vue';
|
||
```
|
||
引入 Vue 3 的 `ref` 和 `watch` 函数。
|
||
|
||
#### 2.2 定义组件属性
|
||
```javascript
|
||
const props = defineProps({
|
||
dataList: {
|
||
type: Object,
|
||
default: () => []
|
||
},
|
||
// 其他属性...
|
||
});
|
||
```
|
||
定义组件接收的属性。
|
||
|
||
#### 2.3 初始化图表
|
||
```javascript
|
||
const chart = ref(null);
|
||
let echarts = null;
|
||
|
||
const initChart = async (canvas) => {
|
||
await initEcharts(canvas);
|
||
updateChart();
|
||
};
|
||
|
||
const initEcharts = async (canvas) => {
|
||
echarts = await import('echarts');
|
||
const { init } = await import('@/uni_modules/lime-echart/static/echarts.min');
|
||
echarts = init(canvas, echarts);
|
||
};
|
||
```
|
||
- `chart` 用于引用 `l-echart` 组件。
|
||
- `initChart` 方法在图表初始化时调用,先初始化 ECharts 实例,再更新图表。
|
||
- `initEcharts` 方法异步加载 ECharts 并初始化实例。
|
||
|
||
#### 2.4 处理数据
|
||
```javascript
|
||
const processData = () => {
|
||
const legendData = [...new Set(props.dataList.map((item) => item[props.legendField]))];
|
||
|
||
return legendData.map((legendItem) => {
|
||
const seriesData = props.dataList
|
||
.filter((item) => item[props.legendField] === legendItem)
|
||
.sort((a, b) => new Date(a[props.xField]) - new Date(b[props.xField]))
|
||
.map((item) => ({
|
||
name: item[props.xField],
|
||
value: [item[props.xField], item[props.yField]]
|
||
}));
|
||
|
||
return {
|
||
name: legendItem,
|
||
type: 'line',
|
||
showSymbol: true,
|
||
data: seriesData
|
||
};
|
||
});
|
||
};
|
||
```
|
||
处理传入的数据,根据 `legendField` 分组,对每组数据按 `xField` 排序,并转换为 ECharts 所需的格式。
|
||
|
||
#### 2.5 获取图表配置
|
||
```javascript
|
||
const getOption = () => ({
|
||
tooltip: {
|
||
trigger: 'axis',
|
||
formatter: (params) => {
|
||
return `${params[0].axisValue}<br/>` + params.map((item) => `${item.marker} ${item.seriesName}: ${item.value[1]}`).join('<br/>');
|
||
}
|
||
},
|
||
// 其他配置...
|
||
});
|
||
```
|
||
返回 ECharts 的配置对象,包括 tooltip、x 轴、y 轴、系列数据、图例和网格等配置。
|
||
|
||
#### 2.6 更新图表
|
||
```javascript
|
||
const updateChart = () => {
|
||
if (!chart.value) return;
|
||
|
||
const option = getOption();
|
||
chart.value.setOption(option);
|
||
};
|
||
```
|
||
如果 `chart` 实例存在,获取最新的图表配置并更新图表。
|
||
|
||
#### 2.7 监听数据变化
|
||
```javascript
|
||
watch(
|
||
() => props.dataList,
|
||
() => {
|
||
updateChart();
|
||
},
|
||
{ deep: true }
|
||
);
|
||
```
|
||
当 `props.dataList` 发生变化时,调用 `updateChart` 方法更新图表。
|
||
|
||
### 3. 样式部分
|
||
```css
|
||
.chart-container {
|
||
width: 100%;
|
||
height: 30vh;
|
||
}
|
||
```
|
||
设置图表容器的宽度为 100%,高度为 30vh。
|
||
|
||
## 五、注意事项
|
||
- 确保项目中已经正确安装并配置了 `lime-echart` 插件。
|
||
- 传入的 `dataList` 数据格式要符合要求,包含 `xField`、`yField` 和 `legendField` 对应的数据。
|
||
- 由于使用了异步加载 ECharts,可能会有一定的延迟,需要确保在合适的时机初始化图表。 |