<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) { const allData = reactive({ series: [], legend: [], id: guid(), chart: null, timer: null, anIndex: 0, }); const resizeTheChart = () => { if (allData.chart) { allData.chart.resize(); } }; const init = () => { let chartDom = echarts.init(document.getElementById(allData.id)); var barWidth = 12; var option; option = { color: ['#3FFFC2', '#FFF21C', 'orange'], tooltip: { trigger: 'axis', }, grid: { top: 40, bottom: 30, right: 80, }, legend: { data: ['降雨量(mm)', '瞬时流量(m³/h)', '水深(m)'], textStyle: { color: '#fff', }, }, dataZoom: [{ type: 'inside', startValue: props.data.xAxis[props.data.xAxis - 48] }], xAxis: [ { type: 'category', splitLine: { show: false, }, axisTick: { show: false, }, axisLabel: { color: 'rgba(255,255,255,1)', fontSize: 14, fontFamily: 'AlibabaPuHuiTi', }, data: props.data.xAxis, }, ], yAxis: [ { name: '', inverse: props.data.inverse || false, //翻转 nameLocation: 'start', // 坐标轴名称显示位置 type: 'value', axisLabel: { color: '#fff', show: true, }, nameTextStyle: { color: '#fff', }, splitLine: { lineStyle: { type: 'dashed', color: '#60C2FF', }, }, max: Math.max(...props.data.yAxis) + 0.5, }, { name: '', inverse: false, nameLocation: 'end', // 坐标轴名称显示位置 type: 'value', nameTextStyle: { color: '#FFB049', }, axisLabel: { show: true, color: '#FFB049', }, splitLine: { lineStyle: { color: '#1D5D81', type: 'dashed', }, }, }, { name: '', inverse: false, offset: 40, nameLocation: 'end', // 坐标轴名称显示位置 type: 'value', nameTextStyle: { color: '#FFF21C', }, axisLabel: { show: true, color: '#FFF21C', }, splitLine: { lineStyle: { color: '#1D5D81', type: 'dashed', }, }, }, ], series: [ { name: '降雨量(mm)', type: 'bar', // barWidth: barWidth, barGap: '10%', // Make series be overlap barCateGoryGap: '10%', itemStyle: { color: new echarts.graphic.LinearGradient(0, 0, 0, 0.7, [ { offset: 0, color: 'rgba(24, 255, 255, 1)', }, { offset: 1, color: 'rgba(188, 255, 255, 1)', }, ]), }, yAxisIndex: 0, data: props.data.yAxis, }, { // smooth: true, //变为曲线 默认false折线 name: '瞬时流量(m³/h)', type: 'line', data: props.data.yAxis2, yAxisIndex: 1, color: '#FFB049', }, { // smooth: true, //变为曲线 默认false折线 name: '水深(m)', type: 'line', data: props.data.yAxis3, yAxisIndex: 2, color: '#FFF21C', }, ], }; option && chartDom.setOption(option, true); allData.chart = chartDom; animateChart(); }; watch( () => props.refresh, () => { if (allData.chart) { allData.chart.dispose(); allData.chart = null; } if (allData.timer) clearInterval(allData.timer); setTimeout(() => { init(); allData.anIndex = 0; }, 0); } ); // echarts动画 function animateChart() { let length = props.data.xAxis.length; allData.timer = setInterval(() => { allData.anIndex++; if (allData.anIndex == length) allData.anIndex = 0; allData.chart.dispatchAction({ type: 'showTip', seriesIndex: 0, dataIndex: allData.anIndex, }); }, 2000); } onMounted(() => { init(); window.addEventListener('resize', resizeTheChart); }); onUnmounted(() => { if (allData.timer) clearInterval(allData.timer); }); return { ...toRefs(allData), resizeTheChart, init, }; }, }; </script>