<script setup lang="ts"> import * as echarts from 'echarts'; import { onMounted, onUnmounted, reactive, ref } from 'vue'; type EChartsOption = echarts.EChartsOption; type ECharts = echarts.ECharts; const colorList = { A: '#F6E3C5', B: '#A0D995', C: '#6CC4A1', D: '#4CACBC', E: '#DF7861', } as any; defineExpose({ run, setTimer, clearTimer, }); const chartsRaceRef = ref<any>(null); const state = reactive({ data: [] as number[], timer: null as any, }); onMounted(() => { getChart(); }); onUnmounted(() => { clearTimer(); }); var raceChart: ECharts; function getChart() { if (raceChart != null && raceChart != undefined) { raceChart.dispose(); } raceChart = echarts.init(chartsRaceRef.value); let option: EChartsOption; for (let i = 0; i < 5; ++i) { state.data.push(Math.round(Math.random() * 200)); } option = { grid: { top: 10, bottom: 30, left: 40, right: 60, }, xAxis: { max: 'dataMax', }, yAxis: { type: 'category', data: ['A', 'B', 'C', 'D', 'E'], inverse: true, animationDuration: 300, animationDurationUpdate: 300, max: 4, // only the largest ${max + 1} bars will be displayed }, series: [ { realtimeSort: true, type: 'bar', itemStyle: { color: function (param) { return colorList[param.name] || '#9EB23B'; }, }, data: state.data, label: { show: true, position: 'right', valueAnimation: true, }, barWidth: 60, }, ], legend: { show: true, }, animationDuration: 0, animationDurationUpdate: 3000, animationEasing: 'linear', animationEasingUpdate: 'linear', }; setTimer(); option && raceChart.setOption(option); } function run() { for (var i = 0; i < state.data.length; ++i) { if (Math.random() > 0.9) { state.data[i] = Math.round(Math.random() * 2000); } else { state.data[i] = Math.round(Math.random() * 200); } } raceChart.setOption<EChartsOption>({ series: [ { type: 'bar', data: state.data, }, ], }); } function setTimer() { if (state.timer) { clearTimer(); } setTimeout(function () { run(); }, 0); state.timer = setInterval(function () { run(); }, 3000); } function clearTimer() { clearInterval(state.timer); } </script> <template> <div class="fit" ref="chartsRaceRef"></div> </template> <style lang="scss" scoped></style>