import { TrendData } from '@/api'; import * as echarts from 'echarts'; import { useEffect, useRef, useState } from 'react'; type ECharts = ReturnType; export interface PropsData { height: number; text: string; chartData: TrendData[]; } const BarTrend = ({ chartData, height, text }: PropsData) => { const domWrapRef = useRef(null!); const echartRef = useRef(null!); const [loading, setLoading] = useState(true); const [data, setData] = useState([]); useEffect(() => { if (domWrapRef.current && !echartRef.current && chartData.length > 0) { echartRef.current = echarts.init(domWrapRef.current, null, { renderer: 'svg', }); } setData(chartData); }, [chartData]); useEffect(() => { const option = { grid: { left: 0, right: 0, bottom: 10, top: 10, }, tooltip: { trigger: 'axis', axisPointer: { type: 'shadow', }, formatter: ( params: { seriesName: string; name: string; value: number }[], ) => { if (params[0]) { const { name, seriesName, value } = params[0]; return `
${name || '-'}
${seriesName} ${value || 0}
`; } return ''; }, }, xAxis: { type: 'category', data: data.map(it => it.name), splitLine: { show: false, }, axisLine: { show: false, }, axisTick: { show: false, }, axisLabel: { show: false, }, }, yAxis: { type: 'value', splitNumber: 4, axisLine: { show: false, }, axisTick: { show: false, }, axisLabel: { show: false, }, splitLine: { lineStyle: { type: 'dashed', color: '#F2F3F5', }, }, }, series: { name: text, type: 'bar', barGap: 0, barMinHeight: 4, data: data.map(it => ({ value: it.count, itemStyle: { color: { type: 'linear', x: 0, y: 0, x2: 0, y2: 1, colorStops: [ { offset: 0, color: '#3248F2' }, { offset: 1, color: '#9E68FC' }, ], }, borderRadius: [4, 4, 0, 0], }, })), }, }; if (domWrapRef.current && echartRef.current && data.length > 0) { echartRef.current.setOption(option); setLoading(false); } const resize = () => { if (echartRef.current) { echartRef.current.resize(); } }; window.addEventListener('resize', resize); return () => { window.removeEventListener('resize', resize); }; }, [data]); if (data.length === 0 && !loading) return
; return
; }; export default BarTrend;