react-chart-js/src/ReactChartJs.tsx

49 lines
1.3 KiB
TypeScript
Raw Normal View History

2021-11-11 16:30:02 +07:00
import Chart from 'chart.js/auto';
import { ChartConfiguration } from 'chart.js';
2020-10-15 08:43:27 +07:00
import React, { FunctionComponent, useEffect, useRef } from 'react';
interface ReactChartJSProps {
2021-11-11 16:30:02 +07:00
chartConfig: ChartConfiguration;
2021-11-11 16:18:18 +07:00
width?: number;
height?: number;
2021-11-11 16:30:02 +07:00
containerProps?: any;
canvasProps?: any;
2020-10-15 08:43:27 +07:00
}
interface RefForChartInstance {
chartInstance?: Chart;
}
2020-10-15 09:47:37 +07:00
const ReactChartJs: FunctionComponent<ReactChartJSProps> = (props: any) => {
2021-11-11 16:18:18 +07:00
const { chartConfig, containerProps, canvasProps } = props;
2020-10-15 08:43:27 +07:00
const canvasDomRef = useRef<HTMLCanvasElement>();
const chartInstanceRef = useRef<RefForChartInstance>({});
2020-10-15 08:43:27 +07:00
useEffect(() => {
const canvasDom = canvasDomRef.current;
const chartInstance = chartInstanceRef.current!.chartInstance;
if (chartInstance) {
chartInstance.destroy();
}
chartInstanceRef.current!.chartInstance = new Chart(canvasDom!, chartConfig!);
}, [chartConfig]);
return (
2021-11-11 16:18:18 +07:00
<div {...containerProps}>
2020-10-15 08:43:27 +07:00
<canvas
2020-10-15 09:47:37 +07:00
ref={(instance: any) => {
2020-10-15 08:43:27 +07:00
canvasDomRef.current = instance!;
}}
2021-11-11 16:18:18 +07:00
width={props.width || 'auto'}
height={props.height || 'auto'}
{...canvasProps}
2020-10-15 08:43:27 +07:00
/>
</div>
);
};
export default ReactChartJs;