vue3之echarts区域折线图
效果:
核心代码:
<template>
<div class="abnormal">
<div class="per">单位:{{ obj.data?.unit }}</div>
<div class="chart" ref="chartsRef"></div>
</div>
</template>
<script setup>
import * as echarts from 'echarts';
import { reactive, onMounted } from 'vue';
const obj = reactive({
data: {
xdata: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],
ydata: [ 0, 0, 0, 1354, 0, 254, 0, 468, 0, 16, 498, 0],
unit: '次'
},
op: {
tooltip: {},
grid: {
top: '5%',
left: '0%',
right: '2%',
bottom: '0%',
containLabel: true,
},
xAxis: null,
yAxis: [
{
type: 'value',
nameLocation: 'end',
axisTick: {
show: false,
},
axisLine: {
show: false,
},
axisLabel: {
textStyle: {
fontSize: 13,
color: '#ffffff',
fontFamily: 'DINPro-Regular',
},
padding: [0, 0, 0, -10],
},
splitLine: {
lineStyle: {
type: 'dashed',
color: 'rgba(160, 169, 192, 0.8)',
},
},
},
],
series: [],
},
})
let myCharts = null;
let chartsRef = ref(null)
const flushChart = () => {
obj.op.xAxis = {};
obj.op.series = [];
obj.op.tooltip = {};
obj.op.tooltip = {
trigger: 'axis',
axisPointer: {
type: 'shadow',
lineStyle: {
color: 'rgba(135, 140, 147, 0.6)',
},
},
formatter(params) {
return `${params[0].name}月 : ${params[1].value}`;
},
backgroundColor: 'rgba(45, 105, 133, 0.8)',
borderWidth: 0,
textStyle: {
color: '#DAE3E7',
fontFamily: 'DINPro-Regular',
},
};
obj.op.xAxis = {
type: 'category',
boundaryGap: false, // 坐标轴两边留白
data: obj.data.xdata,
axisLabel: {
margin: 10,
textStyle: {
color: '#ffffff',
fontSize: 13,
fontFamily: 'DINPro-Regular',
},
},
axisLine: {
lineStyle: {
color: 'rgba(160, 169, 192, 0.6)',
},
},
axisTick: {
show: true,
},
};
obj.op.series.push(
{
name: 'bg',
type: 'bar',
data: [...Array(obj.data.ydata.length).fill(Math.max(...obj.data.ydata) === 0 ? 10 : Math.max(...obj.data.ydata))],
barWidth: '50%',
itemStyle: {
color: 'rgba(255, 255, 255, 0.02)',
},
},
);
obj.op.series.push(
{
type: 'line',
symbol: 'none',
itemStyle: {
normal: {
color: '#68A4FF',
lineStyle: {
color: '#68A4FF',
width: 3,
},
areaStyle: {
// 区域填充样式
color: new echarts.graphic.LinearGradient(0, 1, 0, 0, [
{
offset: 0,
color: 'rgba(104,164,255,0)',
}, {
offset: 0.5,
color: 'rgba(104,164,255,0.6)',
},
{
offset: 1,
color: 'rgba(104,164,255,1)',
},
]),
},
},
},
toolbox: {
show: false,
},
data: obj.data.ydata,
},
);
myCharts.setOption(obj.op);
}
const initChart = () => {
myCharts = echarts.init(chartsRef.value);
flushChart();
}
onMounted(() => {
initChart();
})
const destroyChart = () => {
if (!myCharts) {
return;
}
myCharts.dispose();
myCharts = null;
}
onBeforeMount(() => {
destroyChart();
})
</script>
<style lang="scss" scoped>
.abnormal {
position: relative;
width: 100%;
height: 276px;
margin-top: 19px;
display: inline-block;
.per {
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
margin-bottom: 19px;
}
.chart {
display: inline-block;
width: 100%;
height: 185px;
zoom: 1;
}
}
</style>