<template> <div :id="id" style="width: 100%; height: 100%"></div> </template> <script> import * as echarts from 'echarts'; import { guid } from '@/utils/ruoyi'; import { reactive, toRefs, onMounted, watch, onUnmounted } from 'vue'; export default { name: 'line-chart', props: { data: Object, refresh: Number, }, setup(props) { console.log(props.data); const allData = reactive({ series: [], legend: [], id: guid(), chart: null, timer: null, }); const resizeTheChart = () => { if (allData.chart) { allData.chart.resize(); } }; const init = () => { let chartDom = echarts.init(document.getElementById(allData.id)); var option; option = { // backgroundColor: '#0e1c47', tooltip: { trigger: 'axis', // backgroundColor: 'transparent', axisPointer: { lineStyle: { color: { // data1, type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [ { offset: 0, color: 'rgba(126,199,255,0)', // 0% 处的颜色 }, { offset: 0.5, color: 'rgba(126,199,255,1)', // 100% 处的颜色 }, { offset: 1, color: 'rgba(126,199,255,0)', // 100% 处的颜色 }, ], global: false, // 缺省为 false }, }, }, // formatter: p => { // let dom = `<div style="width: 79px; // height: 50px;;color:#fff;position: relative;"> // <svg style="position: absolute;top: 50%; // left: 50%; // transform: translateX(-50%) translateY(-50%);" class="svg" xmlns="http://www.w3.org/2000/svg" width="100" height="71" viewBox="0 0 84 55"> // <defs> // <style> // .cls-1 { // fill: #07172c; // fill-opacity: 0.8; // stroke: #a7d8ff; // stroke-linejoin: round; // stroke-opacity: 0.2; // stroke-width: 1px; // fill-rule: evenodd; // } // </style> // </defs> // <path id="矩形_419" data-name="矩形 419" class="cls-1" d="M266,595h74v50H266V624.046L261,620l5-3.984V595Z" // transform="translate(-258.5 -592.5)" /> // </svg> // <div style="padding: 4px 8px 4px 14px;display: flex; // justify-content: center; // align-items: center; // flex-direction: column;position: relative;z-index: 1;"> // <div style="margin-bottom: 4px;width:100%;display:${p[0] ? 'flex' : 'none'};justify-content:space-between;align-items:center;"> // <span style="font-size:14px;color:#7ec7ff;">${p[0] ? p[0].seriesName : ''}</span> // <span style="font-size:14px;color:#fff;">${p[0] ? p[0].data : ''}</span> // </div> // <div style="width:100%;height:100%;display:${p[1] ? 'flex' : 'none'};justify-content:space-between;align-items:center;"> // <span style="font-size:14px;color:#7ec7ff;">${p[1] ? p[1].seriesName : ''}</span> // <span style="font-size:14px;color:#fff;">${p[1] ? p[1].data : ''}</span> // </div> // </div> // </div>`; // return dom; // }, }, legend: { align: 'left', right: '1%', top: '1%', type: 'plain', textStyle: { color: '#7ec7ff', fontSize: 13, }, // icon:'rect', itemGap: 25, itemWidth: 18, icon: 'path://M0 2a2 2 0 0 1 2 -2h14a2 2 0 0 1 2 2v0a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2z', data: [ { name: '水深(cm)', }, { name: '降雨量(mm)', }, ], }, grid: { top: '20%', left: '15%', right: '10%', bottom: '25%', // containLabel: true, }, xAxis: [ { type: 'category', boundaryGap: false, axisLine: { //坐标轴轴线相关设置。数学上的x轴 show: true, lineStyle: { color: '#233653', }, }, axisLabel: { //坐标轴刻度标签的相关设置 textStyle: { color: '#7ec7ff', padding: 16, fontSize: 13, }, formatter: function (data) { return data; }, }, splitLine: { show: false, lineStyle: { type: 'dashed', color: '#192a44', }, }, axisTick: { show: false, }, data: props.data.XName, }, ], yAxis: [ { name: 'mg/L', nameTextStyle: { color: '#7ec7ff', fontSize: 15, padding: 1, }, min: 0, splitLine: { show: true, lineStyle: { type: 'dashed', color: '#192a44', }, }, axisLine: { show: false, lineStyle: { color: '#233653', }, }, axisLabel: { show: true, textStyle: { color: '#7ec7ff', padding: 16, }, formatter: function (value) { if (value === 0) { return value; } return value; }, }, axisTick: { show: false, }, }, ], series: [ { name: '水深(cm)', type: 'line', symbol: 'circle', // 默认是空心圆(中间是白色的),改成实心圆 showAllSymbol: true, symbolSize: 0, smooth: true, lineStyle: { normal: { width: 2, color: '#19FFB1', // 线条颜色 }, borderColor: '#19FFB1', }, itemStyle: { color: '#19FFB1', borderColor: '#19FFB1', borderWidth: 2, }, tooltip: { show: true, }, areaStyle: { //区域填充样式 normal: { //线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。 color: new echarts.graphic.LinearGradient( 0, 0, 0, 1, [ { offset: 0, color: 'rgba(25,163,223,.3)', }, { offset: 1, color: 'rgba(25,163,223, 0)', }, ], false ), shadowColor: 'rgba(25,163,223, 0.5)', //阴影颜色 shadowBlur: 20, //shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。 }, }, data: props.data.data1, }, { name: '降雨量(mm)', type: 'line', symbol: 'circle', // 默认是空心圆(中间是白色的),改成实心圆 showAllSymbol: true, symbolSize: 0, smooth: true, lineStyle: { normal: { width: 2, color: '#FFF21C', // 线条颜色 }, borderColor: '#FFF21C', }, itemStyle: { color: '#FFF21C', borderColor: '#FFF21C', borderWidth: 2, }, tooltip: { show: true, }, areaStyle: { //区域填充样式 normal: { //线性渐变,前4个参数分别是x0,y0,x2,y2(范围0~1);相当于图形包围盒中的百分比。如果最后一个参数是‘true’,则该四个值是绝对像素位置。 color: new echarts.graphic.LinearGradient( 0, 0, 0, 1, [ { offset: 0, color: 'rgba(10,219,250,.3)', }, { offset: 1, color: 'rgba(10,219,250, 0)', }, ], false ), shadowColor: 'rgba(10,219,250, 0.5)', //阴影颜色 shadowBlur: 20, //shadowBlur设图形阴影的模糊大小。配合shadowColor,shadowOffsetX/Y, 设置图形的阴影效果。 }, }, data: props.data.data2, }, ], }; option && chartDom.setOption(option, true); allData.chart = chartDom; animateChart(); }; watch( () => props.refresh, () => { if (allData.chart) { allData.chart.dispose(); allData.chart = null; } setTimeout(() => { init(); }, 0); } ); // echarts动画 function animateChart() { let length = props.data.XName.length; let i = 0; allData.timer = setInterval(() => { i++; if (i == length) i = 0; allData.chart.dispatchAction({ type: 'showTip', seriesIndex: 0, dataIndex: i, }); }, 2000); } onMounted(() => { init(); window.addEventListener('resize', resizeTheChart); }); onUnmounted(() => { if (allData.timer) clearInterval(allData.timer); }); return { ...toRefs(allData), resizeTheChart, init, }; }, }; </script>