You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
|
<template>
|
|
|
|
|
|
<div class="bar-chart">
|
|
|
|
|
|
<!-- 图表容器 -->
|
|
|
|
|
|
<div ref="chartDom" class="chart-container"></div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
|
import echarts from 'echarts'; // 需安装:npm install echarts@4.9.0
|
|
|
|
|
|
|
|
|
|
|
|
export default {
|
|
|
|
|
|
name: 'BarChart',
|
|
|
|
|
|
props: {
|
|
|
|
|
|
// X轴数据(必传,数组格式,如:['项目A', '项目B'])
|
|
|
|
|
|
xAxisData: {
|
|
|
|
|
|
type: Array,
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
default: () => []
|
|
|
|
|
|
},
|
|
|
|
|
|
// Y轴数据(必传,包含三组数据,格式如下)
|
|
|
|
|
|
seriesData: {
|
|
|
|
|
|
type: Array,
|
|
|
|
|
|
required: true,
|
|
|
|
|
|
// 格式示例:
|
|
|
|
|
|
// [
|
|
|
|
|
|
// { name: '年初预算合计金额', data: [5000, 8000] },
|
|
|
|
|
|
// { name: '调整后预算合计金额', data: [6000, 7500] },
|
|
|
|
|
|
// { name: '已使用', data: [3000, 5000] }
|
|
|
|
|
|
// ]
|
|
|
|
|
|
default: () => []
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
data() {
|
|
|
|
|
|
return {
|
|
|
|
|
|
chartInstance: null // 图表实例
|
|
|
|
|
|
};
|
|
|
|
|
|
},
|
|
|
|
|
|
watch: {
|
|
|
|
|
|
// 监听数据变化,实时更新图表
|
|
|
|
|
|
xAxisData: {
|
|
|
|
|
|
deep: true,
|
|
|
|
|
|
handler() {
|
|
|
|
|
|
this.updateChart();
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
seriesData: {
|
|
|
|
|
|
deep: true,
|
|
|
|
|
|
handler() {
|
|
|
|
|
|
this.updateChart();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
mounted() {
|
|
|
|
|
|
// 初始化图表
|
|
|
|
|
|
this.$nextTick(() => {
|
|
|
|
|
|
this.initChart();
|
|
|
|
|
|
});
|
|
|
|
|
|
},
|
|
|
|
|
|
beforeDestroy() {
|
|
|
|
|
|
// 销毁图表实例
|
|
|
|
|
|
if (this.chartInstance) {
|
|
|
|
|
|
this.chartInstance.dispose();
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
|
|
|
// 初始化图表
|
|
|
|
|
|
initChart() {
|
|
|
|
|
|
this.chartInstance = echarts.init(this.$refs.chartDom);
|
|
|
|
|
|
this.updateChart();
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// 更新图表数据
|
|
|
|
|
|
updateChart() {
|
|
|
|
|
|
if (!this.chartInstance) return;
|
|
|
|
|
|
|
|
|
|
|
|
const option = {
|
|
|
|
|
|
tooltip: {
|
|
|
|
|
|
trigger: 'axis',
|
|
|
|
|
|
axisPointer: { type: 'shadow' } // 阴影指示器
|
|
|
|
|
|
},
|
|
|
|
|
|
legend: {
|
|
|
|
|
|
// 图例使用 seriesData 中的 name
|
|
|
|
|
|
data: this.seriesData.map(item => item.name),
|
|
|
|
|
|
top: 10
|
|
|
|
|
|
},
|
|
|
|
|
|
grid: {
|
|
|
|
|
|
left: '3%',
|
|
|
|
|
|
right: '4%',
|
|
|
|
|
|
bottom: '3%',
|
|
|
|
|
|
containLabel: true // 包含坐标轴刻度标签
|
|
|
|
|
|
},
|
|
|
|
|
|
xAxis: {
|
|
|
|
|
|
type: 'category',
|
|
|
|
|
|
data: this.xAxisData // X轴数据(通过prop传入)
|
|
|
|
|
|
},
|
|
|
|
|
|
yAxis: {
|
|
|
|
|
|
type: 'value',
|
|
|
|
|
|
name: '金额(元)',
|
|
|
|
|
|
axisLabel: {
|
|
|
|
|
|
formatter: '{value}' // 格式化Y轴标签
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
series: this.seriesData.map(item => ({
|
|
|
|
|
|
...item,
|
|
|
|
|
|
type: 'bar' // 固定为柱状图类型
|
|
|
|
|
|
}))
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
this.chartInstance.setOption(option);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
<style scoped>
|
|
|
|
|
|
.bar-chart {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
min-width: 600px;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
.chart-container {
|
|
|
|
|
|
width: 100%;
|
|
|
|
|
|
height: 400px; /* 固定高度,可根据需求调整 */
|
|
|
|
|
|
}
|
|
|
|
|
|
</style>
|