# React封装ECharts
第一种方法
import React, { useEffect, useRef } from 'react';
import echarts, { ECharts } from 'echarts';
interface PieChartProps {
data: any;
option: any;
}
const PieChart: React.FC<PieChartProps> = ({ data, option }) => {
const chartRef = useRef<HTMLDivElement>(null);
const chart = useRef<ECharts | null>(null);
useEffect(() => {
if (!chart.current) {
chart.current = echarts.init(chartRef.current!);
}
const resizeListener = () => {
chart.current!.resize();
};
window.addEventListener('resize', resizeListener);
return () => {
if (chart.current) {
chart.current.dispose();
}
window.removeEventListener('resize', resizeListener);
};
}, []); // 第一个 useEffect 仅在组件挂载时初始化图表
useEffect(() => {
if (chart.current) {
chart.current.setOption(option);
}
}, [data, option]); // 第二个 useEffect 用于更新图表数据和配置
return <div ref={chartRef} style={{ width: '100%', height: '300px' }}></div>;
};
export default PieChart;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
第二种方法
var chart: echarts.ECharts;
const PieChart = ({ data, option }) => {
const node = useRef<HTMLDivElement>(null);
useEffect(() => {
chart = echarts.init(node.current);
const listener = () => {
chart.resize();
};
window.addEventListener('resize', listener);
return () => {
window.removeEventListener('resize', listener);
chart.dispose();
};
}, []);
useEffect(() => {
chart.setOption(option);
}, [data]);
return <div style={{ width: '100%', height: '100%' }} ref={node}></div>;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
使用了两个 useEffect 钩子,一个用于初始化和清理图表实例,另一个用于在 data 属性变化时更新图表数据和配置。