数据大屏:封装多类型 ECharts 图表组件(折线图、柱状图、地图等)
在大屏数据可视化项目中,我们要用到折线图、柱状图、饼图、地图等十几种 ECharts 图表,但一开始直接写原生 ECharts 会遇到三个致命问题:
- 重复代码多:每个图表都要写「创建实例、绑定事件、监听窗口 resize、销毁实例」的代码,一个项目里重复写几十次,既费时间又容易出错;
- 样式不统一:不同开发人员写的图表,坐标轴颜色、tooltip 样式、边距都不一样,大屏视觉效果乱糟糟;
- 大数据卡顿:大屏经常加载上千条数据,原生 ECharts 默认的动画、高亮效果会让页面帧率暴跌,用户体验差。
所以我封装了统一的多类型 ECharts 组件,核心目标就三个:减少重复代码、统一图表样式、优化大屏性能。整体思路是 “做一个通用的 ECharts 基础壳子,再给不同图表(折线 / 柱状 / 地图)做预设样式和数据适配”,业务开发时只需要传数据,不用关心底层逻辑。
第一部分:先做通用基础组件(BaseEchart)—— 解决所有图表的共性问题
这是封装的核心,相当于给所有图表做一个 “通用模板”,把实例创建、销毁、自适应、事件绑定这些所有图表都需要的逻辑,一次性写好,后续所有图表都基于这个模板来扩展。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 <template>
<!-- 图表容器:必须有宽高,支持自定义样式 -->
<div ref="chartDom" class="base-echart" :style="{ width, height, ...containerStyle }"></div>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted, watch, nextTick } from 'vue';
import * as echarts from 'echarts';
import { useDebounceFn } from '@vueuse/core';
import type { ECharts, EChartsOption } from 'echarts';
// 定义通用Props:所有图表都需要的配置,比如尺寸、自定义配置、事件
const props = defineProps({
// 容器尺寸:支持100%、400px这种格式
width: { type: [String, Number], default: '100%' },
height: { type: [String, Number], default: '400px' },
// 自定义ECharts配置:业务层可以覆盖预设样式
customOption: { type: Object as () => EChartsOption, default: () => ({}) },
// 图表事件:比如click、mouseover,格式是[{type: 'click', handler: fn}]
events: { type: Array, default: () => [] },
// 容器样式:自定义背景、边框等
containerStyle: { type: Object, default: () => ({}) },
// 是否开启窗口resize自适应
autoResize: { type: Boolean, default: true },
});
// 存储ECharts实例和DOM节点
const chartDom = ref<HTMLDivElement | null>(null);
const chartInstance = ref<ECharts | null>(null);
</script>
<style scoped>
.base-echart {
box-sizing: border-box;
}
</style>
第二部分:封装具体图表组件(折线图、柱状图、地图)—— 做个性化适配
基于基础组件,给不同图表做预设样式、数据处理、专属配置。这里以 ** 折线图(LineChart)和地图(MapChart)** 为例,讲清楚 “怎么把基础组件变成具体图表”。
示例 1:折线图组件(LineChart.vue)—— 最常用的图表类型
核心是:预设大屏常用的折线图样式,把业务数据转换成 ECharts 能识别的格式,支持少量个性化配置。
1 | <template> |
第三部分:业务层怎么用?—— 极简调用,开发效率拉满
封装完之后,业务开发人员只用写几行代码,就能生成一个样式统一、性能优化的图表:
1 | <template> |



