From 9c0e305180f31bb2c6927cbc5df87ea67578cf05 Mon Sep 17 00:00:00 2001 From: stephenLYZ <750188453@qq.com> Date: Wed, 20 Jul 2022 16:45:33 +0800 Subject: [PATCH 1/2] fix(plugin-chart-echarts): layout broken when resizing --- .../plugin-chart-echarts/src/components/Echart.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx index 51ea5d5796923..1286c2bc144ca 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx @@ -92,11 +92,10 @@ function Echart( previousSelection.current = currentSelection; }, [currentSelection]); - useEffect(() => { - if (chartRef.current) { - chartRef.current.resize({ width, height }); - } - }, [width, height]); + // Ensure that each render and resize is idempotent + if (chartRef.current) { + chartRef.current.resize({ width, height }); + } return ; } From 046faf29bcf5f050ba1d8398b8983f095492c5bd Mon Sep 17 00:00:00 2001 From: stephenLYZ <750188453@qq.com> Date: Wed, 20 Jul 2022 20:31:28 +0800 Subject: [PATCH 2/2] use useLayoutEffect --- .../src/components/Echart.tsx | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx b/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx index 1286c2bc144ca..0ef7704311c21 100644 --- a/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx +++ b/superset-frontend/plugins/plugin-chart-echarts/src/components/Echart.tsx @@ -22,6 +22,8 @@ import React, { useMemo, forwardRef, useImperativeHandle, + useLayoutEffect, + useCallback, } from 'react'; import { styled } from '@superset-ui/core'; import { ECharts, init } from 'echarts'; @@ -92,10 +94,23 @@ function Echart( previousSelection.current = currentSelection; }, [currentSelection]); - // Ensure that each render and resize is idempotent - if (chartRef.current) { - chartRef.current.resize({ width, height }); - } + const handleSizeChange = useCallback( + ({ width, height }: { width: number; height: number }) => { + if (chartRef.current) { + chartRef.current.resize({ width, height }); + } + }, + [], + ); + + // did mount + useEffect(() => { + handleSizeChange({ width, height }); + }, []); + + useLayoutEffect(() => { + handleSizeChange({ width, height }); + }, [width, height, handleSizeChange]); return ; }