181 lines
4.1 KiB
Vue
181 lines
4.1 KiB
Vue
<template>
|
|
<div>
|
|
<!-- 图例 -->
|
|
<div class="legend">
|
|
<span class="item" v-for="item in legendList" :key="item.id">
|
|
<span
|
|
v-if="item.type === 1"
|
|
class="block"
|
|
:style="{ backgroundColor: item.color }"
|
|
></span>
|
|
<span
|
|
v-if="item.type === 2"
|
|
class="line"
|
|
:style="{ backgroundColor: item.color }"
|
|
>
|
|
<span
|
|
class="line-block"
|
|
:style="{ backgroundColor: item.color }"
|
|
></span>
|
|
</span>
|
|
{{ item.name }}</span
|
|
>
|
|
</div>
|
|
<div id="main" :style="{ width: '100%', height: chartHeight + 'px' }"></div>
|
|
</div>
|
|
</template>
|
|
<script>
|
|
import * as echarts from "echarts";
|
|
import { debounce } from "@/utils/debounce";
|
|
export default {
|
|
name: "bmLineBar",
|
|
data() {
|
|
return {
|
|
myChart: "",
|
|
option: {
|
|
color: [],
|
|
// color: ["#8EF0AB", "#63BDFF", "#288AFF"],
|
|
grid: {
|
|
left: 100,
|
|
right: 10,
|
|
bottom: 30,
|
|
top: 30,
|
|
},
|
|
tooltip: {
|
|
trigger: "axis",
|
|
axisPointer: {
|
|
type: "cross",
|
|
crossStyle: {
|
|
color: "rgba(237,237,237,0.5)",
|
|
},
|
|
},
|
|
formatter: function (params) {
|
|
var res = `<span style='color:rgba(0,0,0,0.8)'>${params[0].name}</span>`;
|
|
for (var i = 0, l = params.length; i < l; i++) {
|
|
res +=
|
|
"<br/>" +
|
|
`<span style='display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:${params[i].color}'></span>` +
|
|
`<span style='display:inline-block;width:150px;color:rgba(0,0,0,0.8);font-size:14px;'>${params[i].seriesName}</span>` +
|
|
`<span style='color:rgba(0,0,0,0.48);font-size:14px;'>${params[i].value}</span>`;
|
|
}
|
|
return res;
|
|
},
|
|
},
|
|
xAxis: {
|
|
type: "category",
|
|
data: [],
|
|
axisTick: {
|
|
show: false,
|
|
},
|
|
axisPointer: {
|
|
type: "shadow",
|
|
},
|
|
},
|
|
yAxis: {
|
|
type: "value",
|
|
},
|
|
series: [],
|
|
},
|
|
};
|
|
},
|
|
props: {
|
|
chartHeight: {
|
|
type: Number,
|
|
default: 300,
|
|
},
|
|
legendList: {
|
|
type: Array,
|
|
default: () => [],
|
|
},
|
|
chartMsg: {
|
|
type: Object,
|
|
default: () => {},
|
|
},
|
|
},
|
|
watch: {
|
|
chartHeight: {
|
|
handler(newVal) {
|
|
this.chartHeight = newVal;
|
|
},
|
|
},
|
|
isOpen(val) {
|
|
this.canvasReset();
|
|
},
|
|
chartMsg: {
|
|
handler(newVal) {
|
|
this.getMes();
|
|
},
|
|
deep: true,
|
|
},
|
|
},
|
|
computed: {
|
|
isOpen() {
|
|
return this.$store.getters.sidebar.opened;
|
|
},
|
|
},
|
|
mounted() {
|
|
this.canvasReset();
|
|
window.addEventListener("resize", this.canvasReset);
|
|
},
|
|
beforeDestroy() {
|
|
if (this.chart) {
|
|
this.myChart.dispose();
|
|
}
|
|
},
|
|
destroyed() {
|
|
window.removeEventListener("resize", this.canvasReset);
|
|
},
|
|
methods: {
|
|
canvasReset() {
|
|
debounce(() => {
|
|
this.getMes();
|
|
}, 500)();
|
|
},
|
|
getMes() {
|
|
if (this.myChart) {
|
|
this.myChart.dispose();
|
|
this.myChart = "";
|
|
}
|
|
var chartDom = document.getElementById("main");
|
|
this.myChart = echarts.init(chartDom);
|
|
this.option.color = this.chartMsg.color;
|
|
this.option.xAxis.data = this.chartMsg.xData;
|
|
this.option.series = this.chartMsg.series;
|
|
this.myChart.setOption(this.option);
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
.legend {
|
|
text-align: right;
|
|
.item {
|
|
display: inline-block;
|
|
margin-right: 10px;
|
|
font-size: 14px;
|
|
color: #8c8c8c;
|
|
.block {
|
|
width: 10px;
|
|
height: 10px;
|
|
display: inline-block;
|
|
margin-right: 4px;
|
|
}
|
|
.line {
|
|
width: 10px;
|
|
height: 10px;
|
|
border-radius: 5px;
|
|
display: inline-block;
|
|
margin-right: 4px;
|
|
position: relative;
|
|
.line-block {
|
|
position: absolute;
|
|
width: 20px;
|
|
height: 2px;
|
|
left: -5px;
|
|
top: 4px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|