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.
 
 
 

177 lines
3.9 KiB

<template>
<div class="chart-container" ref="chartContainer"></div>
</template>
<script>
import * as echarts from 'echarts';
import {getStatistics} from '@/api/yg/dikeMark'
export default {
name: 'ProjectQuantityChart',
props: {
// 可以通过props接收数据,方便父组件传入不同数据
chartData: {
type: Array,
default: () => [
{ city: '广州市', value: 2 },
{ city: '珠海市', value: 1 }
]
}
},
data() {
return {
chart: null,
queryParams: {
pageNum: 1,
pageSize: 10,
ids: null,
data: {
dikeName: null,
markName: null,
type: null,
markType: null,
},
// 排序方式
params: {
// 按哪个字段排序
orderBy: "create_time",
// desc降序,升序asc
sortBy: "desc",
},
},
};
},
mounted() {
getStatistics(this.queryParams).then(res=>{
console.log(666,res)
this.initChart(res);
})
// 添加窗口大小变化监听,使图表响应式调整
window.addEventListener('resize', this.resizeChart);
},
beforeDestroy() {
// 组件销毁前移除事件监听,避免内存泄漏
window.removeEventListener('resize', this.resizeChart);
// 销毁图表实例
if (this.chart) {
this.chart.dispose();
this.chart = null;
}
},
methods: {
initChart(res) {
// 初始化图表
this.chart = echarts.init(this.$refs.chartContainer);
this.updateChart(res);
},
updateChart(res) {
// 提取城市名和数值
// const cities = this.chartData.map(item => item.city);
// const values = this.chartData.map(item => item.value);
const entries = Object.entries(res);
const cities = entries.map(([key, value]) => {
return key
});
const values = entries.map(([key, value]) => {
return value
});
// 设置图表配置项
const option = {
title: {
text: '标识标牌数量统计图',
left: 'center'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
data: cities,
axisLine: {
lineStyle: {
color: '#999'
}
},
axisLabel: {
color: '#333'
}
},
yAxis: {
type: 'value',
name: '数量(个)',
nameTextStyle: {
color: '#333'
},
min: 0,
max: Math.ceil(Math.max(...values) * 1.2), // 动态设置最大值
interval: 1,
axisLine: {
show: true,
lineStyle: {
color: '#999'
}
},
axisLabel: {
color: '#333'
},
splitLine: {
lineStyle: {
color: '#eee',
type: 'solid'
}
}
},
series: [{
name: '数量',
type: 'bar',
data: values,
itemStyle: {
color: '#45B7AF' // 使用相似的青绿色
},
barWidth: '40%',
label: {
show: false
}
}],
color: ['#45B7AF']
};
// 使用配置项显示图表
this.chart.setOption(option);
},
resizeChart() {
if (this.chart) {
this.chart.resize();
}
}
},
watch: {
// 监听数据变化,更新图表
chartData: {
handler() {
this.$nextTick(() => {
this.updateChart();
});
},
deep: true
}
}
};
</script>
<style scoped>
.chart-container {
width: 100%;
height: 400px;
}
</style>