Vue2封装Echarts
使用方法:
1、模版使用
<Echarts :option="chartOption" />
2、导入组件
import Echarts from '@/components/Echarts'
3、配置option
chartOption: { title: { text: '员工学历分布', left: 'left', textStyle: { color: '#333', } }, tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } }, xAxis: { type: 'category', data: [] }, yAxis: { type: 'value' }, series: [ { data: [], type: 'bar' } ] }
4、接口拿到数据赋值
async getAnalysisEducationQuery() { let educationQuery = await analysisEducationQuery({}) let category = [] let data = [] educationQuery.data.forEach(el => { category.push(el.name) data.push(el.number) }); this.chartOption.xAxis.data = category this.chartOption.series[0].data = data this.loading = false },
组件代码:
<template>
<div ref="chartContainer" class="chart-container" :style="{ width: width, height: height }"></div>
</template>
<script>
import echarts from 'echarts';
export default {
name: 'ECharts',
props: {
option: {
type: Object,
required: true
},
width: {
type: String,
default: '100%'
},
height: {
type: String,
default: '400px'
},
autoResize: {
type: Boolean,
default: true
}
},
data() {
return {
myChart: null,
resizeObserver: null
};
},
mounted() {
this.initChart();
this.observeResize();
},
beforeDestroy() {
this.cleanup();
},
watch: {
// 监听 option 变化,更新图表
option: {
handler(newOption) {
this.updateChart(newOption);
},
deep: true
},
// 监听宽高变化,重绘图表
width() {
this.resizeChart();
},
height() {
this.resizeChart();
}
},
methods: {
// 初始化图表
initChart() {
if (!this.$refs.chartContainer) return;
// 销毁旧实例(避免内存泄漏)
if (this.myChart) {
this.myChart.dispose();
}
// 创建新实例
this.myChart = echarts.init(this.$refs.chartContainer);
this.myChart.setOption(this.option);
// 初始自适应
this.resizeChart();
},
// 更新图表配置
updateChart(newOption) {
if (this.myChart) {
this.myChart.setOption(newOption);
}
},
// 重绘图表
resizeChart() {
if (this.myChart) {
this.myChart.resize();
}
},
// 监听容器尺寸变化
observeResize() {
if (!this.autoResize || !this.$refs.chartContainer) return;
// 检查浏览器是否支持 ResizeObserver
if ('ResizeObserver' in window) {
// 使用 ResizeObserver 监听容器尺寸变化
this.resizeObserver = new ResizeObserver(() => {
this.resizeChart();
});
this.resizeObserver.observe(this.$refs.chartContainer);
}
// 监听窗口缩放
window.addEventListener('resize', this.resizeChart);
},
// 清理监听器
cleanup() {
if (this.resizeObserver) {
this.resizeObserver.disconnect();
this.resizeObserver = null;
}
window.removeEventListener('resize', this.resizeChart);
if (this.myChart) {
this.myChart.dispose();
this.myChart = null;
}
}
}
};
</script>
<style scoped>
.chart-container {
width: 100%;
height: 100%;
min-width: 300px;
/* 防止图表过小时布局异常 */
}
</style>

浙公网安备 33010602011771号