RadarChartModule.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. //y轴显示数据
  3. Data:{
  4. type:number, 0(实线) 1虚线(预测) 2(填充)
  5. name:string,
  6. yIndex:number, //yName的下标索引(第几个y坐标轴)
  7. data:string[],
  8. }
  9. props:{
  10. yName:string || string[], //y轴名称 一个或多个
  11. xData:string[], //x轴时间数据
  12. dataList:Data[], //折线的数据列表
  13. currentType:string, //当前选择那个tabs 需要外部更新当前选中type时传入
  14. typeList:string[], //图表下的选择类型列表
  15. onChange:(id:number)=>{}
  16. }
  17. */
  18. import { useEffect, useRef, useState } from 'react';
  19. import echarts from 'echarts';
  20. import styles from './index.less';
  21. import dayjs from 'dayjs';
  22. import { Empty } from 'antd';
  23. //图表模块
  24. const RadarChartModule = props => {
  25. const chartDomRef = useRef();
  26. const chartRef = useRef();
  27. const { indicator, data, name = '' } = props;
  28. useEffect(() => {
  29. chartRef.current = echarts.init(chartDomRef.current);
  30. window.addEventListener('resize', resetChart);
  31. return () => window.removeEventListener('resize', resetChart);
  32. }, []);
  33. useEffect(() => {
  34. if (!chartRef.current) return;
  35. const option = { ...defaultOption };
  36. option.radar.indicator = indicator;
  37. option.series = [{ ...option.series[0], data: data, name }];
  38. console.log(JSON.stringify(option));
  39. chartRef.current.clear();
  40. chartRef.current.setOption(option);
  41. chartRef.current.resize();
  42. }, [indicator, data]);
  43. const resetChart = () => {
  44. if (chartRef.current) chartRef.current.resize();
  45. };
  46. const getStyle = () => {
  47. if (data && data.length != 0) return { width: '100%', height: '100%' };
  48. else return { width: '100%', height: '100%', display: 'none' };
  49. };
  50. return (
  51. <div className={styles.content}>
  52. <div style={getStyle()} ref={chartDomRef} />
  53. {(!data || data.length == 0) && <Empty />}
  54. </div>
  55. );
  56. };
  57. export default RadarChartModule;
  58. const colors = [
  59. // '#666600',
  60. // '#91cc75',
  61. '#fac858',
  62. '#ee6666',
  63. '#73c0de',
  64. '#3ba272',
  65. '#fc8452',
  66. '#9a60b4',
  67. '#ea7ccc',
  68. ];
  69. const defaultOption = {
  70. color: colors,
  71. tooltip: {
  72. trigger: 'item',
  73. },
  74. radar: {
  75. name: {
  76. textStyle: {
  77. fontSize: 18,
  78. },
  79. },
  80. splitArea: {
  81. areaStyle: {
  82. color: [
  83. 'rgba(27, 133, 168, 0.8)',
  84. 'rgba(27, 133, 168, 0.7)',
  85. 'rgba(27, 133, 168, 0.6)',
  86. 'rgba(27, 133, 168, 0.4)',
  87. 'rgba(27, 133, 168, 0.3)',
  88. ],
  89. // shadowColor: 'rgba(0, 0, 0, 0.2)',
  90. // shadowBlur: 10
  91. },
  92. },
  93. axisLine: {
  94. lineStyle: {
  95. color: '#238BB6',
  96. },
  97. },
  98. splitLine: {
  99. show: false,
  100. },
  101. indicator: [
  102. { name: 'Sales' },
  103. { name: 'Administration' },
  104. { name: 'Information Technology' },
  105. { name: 'Customer Support' },
  106. { name: 'Development' },
  107. { name: 'Marketing' },
  108. ],
  109. },
  110. series: [
  111. {
  112. name: '',
  113. type: 'radar',
  114. tooltip: {
  115. trigger: 'item',
  116. },
  117. symbol: 'none',
  118. // areaStyle: {},
  119. data: [
  120. {
  121. value: [2, 3, 0, 100, 0, 1],
  122. },
  123. {
  124. value: [3, 5, 10, 90, 0, 1],
  125. },
  126. ],
  127. },
  128. ],
  129. };