diff --git a/packages/effects/plugins/src/echarts/use-echarts.ts b/packages/effects/plugins/src/echarts/use-echarts.ts index d2e96ebb..b5ff6d42 100644 --- a/packages/effects/plugins/src/echarts/use-echarts.ts +++ b/packages/effects/plugins/src/echarts/use-echarts.ts @@ -32,6 +32,21 @@ function useEcharts(chartRef: Ref) { const { height, width } = useWindowSize(); const resizeHandler: () => void = useDebounceFn(resize, 200); + const getChartEl = (): HTMLElement | null => { + const refValue = chartRef?.value as unknown; + if (!refValue) return null; + if (refValue instanceof HTMLElement) { + return refValue; + } + const maybeComponent = refValue as { $el?: HTMLElement }; + return maybeComponent.$el ?? null; + }; + + const isElHidden = (el: HTMLElement | null): boolean => { + if (!el) return true; + return el.offsetHeight === 0 || el.offsetWidth === 0; + }; + const getOptions = computed((): EChartsOption => { if (!isDark.value) { return {}; @@ -54,7 +69,7 @@ function useEcharts(chartRef: Ref) { const renderEcharts = ( options: EChartsOption, - clear = true, + clear = true ): Promise> => { cacheOptions = options; const currentOptions = { @@ -69,6 +84,13 @@ function useEcharts(chartRef: Ref) { return; } nextTick(() => { + const el = getChartEl(); + if (isElHidden(el)) { + useTimeoutFn(async () => { + resolve(await renderEcharts(currentOptions)); + }, 30); + return; + } useTimeoutFn(() => { if (!chartInstance) { const instance = initCharts(); @@ -83,6 +105,10 @@ function useEcharts(chartRef: Ref) { }; function resize() { + const el = getChartEl(); + if (isElHidden(el)) { + return; + } chartInstance?.resize({ animation: { duration: 300,