mirror of
https://gitee.com/js-yhsec/energy_storage.git
synced 2026-05-27 18:59:26 +08:00
174 lines
4.6 KiB
Vue
174 lines
4.6 KiB
Vue
<template>
|
||
<div class="mychart">
|
||
<!-- <div class="text_Cur">
|
||
<div v-for="item in curList" :key="item.key">
|
||
<div>{{ item.name }}</div>
|
||
<span class="mark">{{ item.value ? item.value : 0 }}</span>
|
||
<span class="d">{{ item.d }}</span>
|
||
</div>
|
||
</div> -->
|
||
<div :id="myChartId" class="mychart"></div>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import { processData } from '@/utils/dealWithData'
|
||
|
||
export default {
|
||
name: '',
|
||
props: {
|
||
propKey: { type: String, default: '' },
|
||
propData: { type: Array, default: () => [] },
|
||
propOption: { type: Object, default: { series: [] } }
|
||
},
|
||
data() {
|
||
return {
|
||
myChartId: 'mychart' + Math.floor(Math.random() * 9999),
|
||
myEchart: null,
|
||
xData: [], // EChart的 x 轴 option
|
||
yData: [], // EChart的 y 轴 option
|
||
}
|
||
},
|
||
watch: {
|
||
propData: {
|
||
handler(newVal, oldVal) {
|
||
if (JSON.stringify(newVal) !== JSON.stringify(oldVal)) {
|
||
this.$nextTick(() => {
|
||
this.drawLineChart()
|
||
})
|
||
}
|
||
},
|
||
immediate: true, // 初始化时更新
|
||
deep: true // 确保深度比较
|
||
},
|
||
propOption: {
|
||
handler(newVal, oldVal) {
|
||
},
|
||
immediate: true,
|
||
}
|
||
},
|
||
mounted() { },
|
||
beforeUnmount() {
|
||
window.removeEventListener('resize', this.handleResize)
|
||
if (this.myEchart) {
|
||
this.myEchart.dispose()
|
||
this.myEchart = null
|
||
}
|
||
},
|
||
|
||
methods: {
|
||
handleResize() {
|
||
if (this.myEchart) {
|
||
this.myEchart.resize()
|
||
}
|
||
},
|
||
|
||
getChartData() {
|
||
const keyList = this.propOption.series.map((item) => item.key)
|
||
const result = processData(this.propData, keyList)
|
||
this.xData = result.dates
|
||
this.yData = result.values
|
||
|
||
if (this.xData.length == 0) {
|
||
const today = new Date();
|
||
for (let i = 6; i >= 0; i--) {
|
||
const date = new Date(today); // 每次创建新日期实例(避免修改原日期)
|
||
date.setDate(today.getDate() - i); // 往前推 i 天
|
||
const year = date.getFullYear();
|
||
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份 0-11,需 +1
|
||
const day = String(date.getDate()).padStart(2, '0');
|
||
this.xData.push(`${month}-${day}`);
|
||
|
||
for (let j = 0; j < keyList.length; j++) {
|
||
if (j == 0) this.yData.push([])
|
||
else this.yData[j].push(0)
|
||
}
|
||
}
|
||
}
|
||
},
|
||
|
||
drawLineChart(activeKey) {
|
||
|
||
this.getChartData(activeKey)
|
||
if (this.myEchart) {
|
||
this.myEchart.dispose()
|
||
}
|
||
const chartDom = document.getElementById(this.myChartId)
|
||
if (!chartDom) return;
|
||
let myEchart = this.$echarts.init(chartDom)
|
||
this.myEchart = myEchart
|
||
let option = {
|
||
animation: false,
|
||
tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
|
||
legend: { top: 10, textStyle: { color: '#fff' } },
|
||
grid: { left: '3%', right: '4%', bottom: '1%', top: '32%' },
|
||
xAxis: {
|
||
type: 'category',
|
||
data: this.xData,
|
||
axisLine: { lineStyle: { type: 'dashed', color: '#435463' } },
|
||
axisLabel: { color: '#fff' }
|
||
},
|
||
yAxis: [],
|
||
series: []
|
||
}
|
||
|
||
const yAxisItem = {
|
||
name: '',
|
||
type: 'value',
|
||
min: 0,
|
||
max: 2,
|
||
//interval: 1, // 强制步长
|
||
splitNumber: 2, // 分段数
|
||
nameTextStyle: { color: '#fff' },
|
||
splitLine: { lineStyle: { type: 'dashed', color: '#435463' } },
|
||
axisLabel: { color: '#fff', fontSize: 12 },
|
||
}
|
||
|
||
if (this.propOption.yAxis) {
|
||
this.propOption.yAxis.forEach((item, index) => {
|
||
const maxVal = Math.max(...this.yData[index]);
|
||
if (maxVal && maxVal > 0) {
|
||
yAxisItem.min = undefined
|
||
yAxisItem.max = maxVal
|
||
}
|
||
yAxisItem.name = item
|
||
option.yAxis.push(yAxisItem)
|
||
})
|
||
}
|
||
|
||
if (this.propOption.series) {
|
||
this.propOption.series.forEach((item, index) => {
|
||
option.series.push({
|
||
name: item.name,
|
||
type: 'bar',
|
||
color: item.color,
|
||
data: this.yData[index],
|
||
barWidth: '20%'
|
||
})
|
||
})
|
||
}
|
||
|
||
if (option.yAxis.length == 0) { option.yAxis.push(yAxisItem) }
|
||
option && myEchart.setOption(option)
|
||
this.setupResizeListener()
|
||
|
||
},
|
||
setupResizeListener() {
|
||
window.removeEventListener('resize', this.handleResize);
|
||
window.addEventListener('resize', this.handleResize)
|
||
}
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss" scoped>
|
||
.mychart {
|
||
height: calc(100% - 35px);
|
||
background-color: #80808010;
|
||
|
||
.mychart {
|
||
height: calc(100% - 5px);
|
||
}
|
||
}
|
||
</style>
|