index.jsx 1.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import React, { useRef, useEffect } from 'react';
  2. // 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
  3. import * as echarts from 'echarts/core';
  4. // 引入图表,图表后缀都为 Chart
  5. import {
  6. BarChart,
  7. PieChart,
  8. LineChart,
  9. GaugeChart,
  10. RadarChart,
  11. PictorialBarChart,
  12. } from 'echarts/charts';
  13. // 引入提示框,标题,直角坐标系,数据集,内置数据转换器组件,组件后缀都为 Component
  14. import {
  15. TitleComponent,
  16. TooltipComponent,
  17. ToolboxComponent,
  18. GridComponent,
  19. DatasetComponent,
  20. LegendComponent,
  21. DataZoomComponent,
  22. TransformComponent,
  23. VisualMapComponent,
  24. } from 'echarts/components';
  25. // 标签自动布局,全局过渡动画等特性
  26. import { LabelLayout, UniversalTransition } from 'echarts/features';
  27. // 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
  28. import { CanvasRenderer } from 'echarts/renderers';
  29. // 注册必须的组件
  30. echarts.use([
  31. TitleComponent,
  32. TooltipComponent,
  33. ToolboxComponent,
  34. GridComponent,
  35. DatasetComponent,
  36. LegendComponent,
  37. DataZoomComponent,
  38. TransformComponent,
  39. VisualMapComponent,
  40. BarChart,
  41. PieChart,
  42. LineChart,
  43. GaugeChart,
  44. RadarChart,
  45. PictorialBarChart,
  46. LabelLayout,
  47. UniversalTransition,
  48. CanvasRenderer
  49. ]);
  50. export default (props) => {
  51. const { className, style, option } = props;
  52. const domRef = useRef();
  53. const chartRef = useRef();
  54. useEffect(() => {
  55. if (!chartRef.current) {
  56. chartRef.current = echarts.init(domRef.current);
  57. }
  58. const resize = () => {
  59. const t = setTimeout(() => {
  60. clearTimeout(t);
  61. chartRef.current.resize();
  62. }, 100);
  63. };
  64. chartRef.current.setOption(option);
  65. resize();
  66. window.addEventListener('resize', resize);
  67. return () => window.removeEventListener('resize', resize);
  68. }, [option]);
  69. return (
  70. <div className={className} style={style} ref={domRef}></div>
  71. )
  72. }