<script setup lang="ts"> import { reactive, onMounted } from 'vue'; import { getRandomPresetColor } from '../utils'; import * as echarts from 'echarts'; type EChartsOption = echarts.EChartsOption; type ECharts = echarts.ECharts; interface Props { id: string; } const props = withDefaults(defineProps<Props>(), { id: 'mychart', }); interface ChartDomsType { [proppName: string]: ECharts | null | undefined; } const chartDoms = reactive<ChartDomsType>({}); onMounted(() => { setTimeout(() => { getLeftChart(); getRightChart(); }, 500); }); function getLeftChart() { const id = `${props.id}-left`; const domkey = `chartLeftDom${props.id}`; let myChart = chartDoms[domkey]; if (myChart != null && myChart != undefined) { chartDoms[domkey]?.dispose(); } const chartDom = document.getElementById(id) as HTMLElement; if (chartDom) { myChart = echarts.init(chartDom); let option: EChartsOption; option = { color: getRandomPresetColor(), tooltip: { trigger: 'axis', axisPointer: { type: 'line', }, }, xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], }, yAxis: { type: 'value', }, series: [ { data: getRandomData(), type: 'line', }, ], }; option && myChart.setOption(option); } } function getRightChart() { const id = `${props.id}-right`; const domkey = `chartRightDom${props.id}`; let myChart = chartDoms[domkey]; if (myChart != null && myChart != undefined) { chartDoms[domkey]?.dispose(); } const chartDom = document.getElementById(id) as HTMLElement; if (chartDom) { myChart = echarts.init(chartDom); let option: EChartsOption; option = { color: getRandomPresetColor(), tooltip: { trigger: 'axis', axisPointer: { type: 'shadow', }, }, xAxis: { type: 'category', data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], }, yAxis: { type: 'value', }, series: [ { data: getRandomData(), type: 'bar', }, ], }; option && myChart.setOption(option); } } function getRandomData() { let arr = []; for (let i = 0; i < 7; i++) { arr.push(Math.round(Math.random() * 300)); } return arr; } </script> <template> <div class="map full-width"> <div class="q-ml-sm" :id="`${props.id}-left`"></div> <div class="q-mr-sm" :id="`${props.id}-right`"></div> </div> </template> <style lang="scss" scoped> .map { display: grid; grid-template-columns: repeat(2, 1fr); column-gap: $padding-md; > div { border: 1px solid $border-color; height: 600px; } } </style>