diff --git a/frontend/src/composables/useChart.ts b/frontend/src/composables/useChart.ts index 9846ecf..d86578d 100644 --- a/frontend/src/composables/useChart.ts +++ b/frontend/src/composables/useChart.ts @@ -4,9 +4,18 @@ import * as echarts from 'echarts' export function useChart(el: Ref) { let chart: echarts.ECharts | null = null + let ro: ResizeObserver | null = null + + function ensureChart(): void { + if (!chart && el.value) chart = echarts.init(el.value) + } function setOption(option: echarts.EChartsCoreOption): void { + ensureChart() chart?.setOption(option, true) + // 数据通常在容器布局完成后才到(父组件异步拉取),此处同步一次尺寸, + // 避免 canvas 停在 init 时的窄宽(tab/初始化偏早导致)。 + chart?.resize() } function resize(): void { @@ -14,12 +23,18 @@ export function useChart(el: Ref) { } onMounted(() => { - if (el.value) chart = echarts.init(el.value) + ensureChart() + // ResizeObserver: 容器拿到真实宽度 / tab 切换 / 窗口变化时自动 resize + if (el.value && typeof ResizeObserver !== 'undefined') { + ro = new ResizeObserver(() => chart?.resize()) + ro.observe(el.value) + } window.addEventListener('resize', resize) }) onUnmounted(() => { window.removeEventListener('resize', resize) + ro?.disconnect() chart?.dispose() chart = null })