使用React和ResizeObserver实现自适应ECharts图表
-
使用React创建图表组件
import React, { useEffect, useRef } from 'react';
import echarts from 'echarts';
const Chart = ({ data }) => {
const chartRef = useRef(null);
useEffect(() => {
const chart = echarts.init(chartRef.current);
const options = { // 配置图表选项 // ... };
chart.setOption(options);
return () => { chart.dispose(); // 销毁图表 };
}, [data]);
return <div ref={chartRef} style= />;
};
export default Chart;
在上面的代码中,我们创建了一个名为Chart的函数组件。组件接收一个名为data的属性,它用于更新图表的数据。
在组件的useEffect钩子函数中,我们初始化了ECharts实例,并通过setOption方法设置图表的选项。我们还在组件卸载时使用dispose方法销毁了图表实例,以释放资源。
组件的返回部分包含一个div元素,我们使用ref属性将其与chartRef关联起来。这个div元素将作为ECharts图表的容器,并且我们为其设置了宽度为100%和高度为400像素,你可以根据需要调整这些值。
-
使用ResizeObserver监听容器大小变化、
现在,我们要使用ResizeObserver来监听图表容器的大小变化,并在大小发生变化时重新渲染图表。
为此,我们将使用一个名为useResizeObserver的自定义Hook,它使用ResizeObserver API来监听元素的大小变化。
import { useEffect, useState } from 'react';
const useResizeObserver = (ref) => {
const [dimensions, setDimensions] = useState(null);
useEffect(() => {
const observer = new ResizeObserver((entries) => {
const { width, height } = entries[0].contentRect;
setDimensions({ width, height });
});
observer.observe(ref.current);
return () => {
observer.unobserve(ref.current);
};
}, [ref]);
return dimensions;
};
export default useResizeObserver;
在上面的代码中,我们定义了一个名为useResizeObserver的Hook。它接收一个ref作为参数,该ref引用了要监听的元素。每当元素的大小发生变化时,我们会更新dimensions状态,以便我们能够在组件中获取到最新的宽度和高度。
现在,我们可以在我们的Chart组件中使用useResizeObserver来监听容器的大小变化,并相应地重新渲染图表。
import React, { useEffect, useRef } from 'react';
import echarts from 'echarts';
import useResizeObserver from './useResizeObserver';
const Chart = ({ data }) => {
const chartRef = useRef(null);
const dimensions = useResizeObserver(chartRef);
useEffect(() => {
const chart = echarts.init(chartRef.current);
const options = {
// 配置图表选项
// ...
};
chart.setOption(options);
return () => {
chart.dispose();
};
}, [data, dimensions]);
return <div ref={chartRef} style= />;
};
export default Chart;
在上述示例代码中,我们从useResizeObserver钩子中获取到最新的dimensions值,并将其添加到useEffect的依赖数组中。这意味着每当容器的大小发生变化时,我们都会重新执行副作用函数并重新渲染图表。
这样,当图表容器的大小发生变化时,图表将自动根据新的尺寸重新绘制,以便适应新的布局。