224 lines
4.2 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="blue-line-chart">
<div :id="props.lineId" :ref="props.lineId" style="width: 100%; height: 100%"></div>
</div>
</template>
<script lang="ts" setup>
import symbolIcon from "@/assets/images/lineSymbol.png";
import { onMounted, watch, ref, onBeforeUnmount } from "vue";
import * as echarts from "echarts";
// import { GlobalStore } from "@/stores";
// const store = GlobalStore();
import mitts from "@/utils/bus"; //兄弟组件传值
// ts
type Props = {
xData?: any; // 传入x轴对应的数据
yData?: any; // 传入y轴对应的数据
lineId?: any; // 传入折线图dom元素对应的id
lineSmooth?: any; // 传入折线图的平滑度 0-1,(0:折线 1:圆滑)
};
// withDefaults 定义默认值(传入的数据类型同默认值)
const props = withDefaults(defineProps<Props>(), {
xData: ["09-01", "09-02", "09-03", "09-04", "09-05", "09-06", "09-07"],
yData: [10, 5, 20, 25, 15, 25, 12],
lineId: "waterShortTerm",
lineSmooth: 0
// num: () => [12, 13, 14] // 复杂数据类型使用函数方式
});
watch(
() => props.xData,
newVal => {
// console.log(newVal, "newVal");
if (newVal) {
// props.xData = newVal;
drawChart();
}
}
);
// 图表数据项
let option = ref(null as any);
function initOption() {
option.value = {
// backgroundColor: '#071c3a',
title: {
// text: '日用气量分析',
textStyle: {
align: "center",
color: "#fff",
fontSize: 20
},
top: "2%",
left: "center"
},
tooltip: {
trigger: "axis"
},
grid: {
top: "20%",
left: "6%",
right: "4%",
bottom: "10%"
// containLabel: true
},
xAxis: [
{
type: "category",
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
splitArea: {
// show: true,
color: "#f00",
lineStyle: {
color: "#f00"
}
},
axisLabel: {
color: "#fff"
},
splitLine: {
show: false
},
boundaryGap: false,
data: props.xData
}
],
yAxis: [
{
type: "value",
// name: unit.value,
nameTextStyle: {
color: "#fff",
nameLocation: "start"
},
min: 0,
// max: 140,
splitNumber: 3,
splitLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLine: {
show: true,
lineStyle: {
color: "#14346C"
}
},
axisLabel: {
show: true,
margin: 20,
textStyle: {
color: "#fff"
}
},
axisTick: {
show: true
}
}
],
series: [
{
type: "line",
// smooth: true, //是否平滑
showAllSymbol: true,
symbol: `image://${symbolIcon}`,
// symbol: "circle",
smooth: props.lineSmooth,
symbolSize: 30,
label: {
show: false,
position: "top",
textStyle: {
color: "#fff"
}
},
itemStyle: {
color: "#97c6c8",
borderColor: "#97c6c8",
borderWidth: 5,
shadowColor: "rgba(0, 0, 0, .6)",
shadowBlur: 0,
lineStyle: {
width: 0.1,
normal: {
color: "#fff",
shadowBlur: 0
}
}
},
tooltip: {
show: true
},
areaStyle: {
normal: {
color: new echarts.graphic.LinearGradient(
0,
0,
0,
1,
[
{
offset: 0,
color: "rgba(74, 192, 243,1)"
},
{
offset: 0.9,
color: "rgba(74, 192, 243,0.2)"
},
{
offset: 1,
color: "rgba(74, 192, 243, 0.1)"
}
],
false
),
// shadowColor: "rgba(74, 192, 243, 0.1)",
shadowBlur: 20
}
},
data: props.yData
}
]
};
}
function drawChart() {
initOption();
// console.log("绘制前数据", props.yData);
let chartDom = document.getElementById(props.lineId);
if (chartDom) {
chartDom.removeAttribute("_echarts_instance_");
}
let waterShortTerm = echarts.init(document.getElementById(props.lineId));
waterShortTerm.setOption(option.value);
}
onMounted(async () => {
drawChart();
});
// 即时销毁事件总线派发否则会执行两次miits.on造成不必要的内存浪费 7.14 by CJP
onBeforeUnmount(async () => {
mitts.off("devSn");
});
</script>
<style lang="scss" scoped>
.blue-line-chart {
width: 100%;
height: 100%;
position: relative;
}
</style>