index.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2024-07-02 17:50:08
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2024-12-17 17:00:48
  6. * @FilePath: /MediScreen/src/components/BarChartComponent/index.tsx
  7. * @Description: BarChartComponent示例代码
  8. */
  9. import React, { useEffect, useState } from 'react';
  10. import './style.less';
  11. interface BarChartItem {
  12. label: string;
  13. value: number | null; // 如果可能为null,请声明为 number | null
  14. unit: string;
  15. }
  16. interface BarChartComponentProps {
  17. data: BarChartItem[];
  18. }
  19. const maxBarWidth = 200; // 最大条形图宽度
  20. const BarChartComponent: React.FC<BarChartComponentProps> = ({ data }) => {
  21. const [animatedWidths, setAnimatedWidths] = useState<number[]>([]);
  22. useEffect(() => {
  23. if (data.length === 0) {
  24. setAnimatedWidths([]);
  25. return;
  26. }
  27. const values = data.map(d => d.value || 0); // 如果为 null 则赋值为0
  28. const maxValue = Math.max(...values);
  29. // 设置初始宽度为0
  30. setAnimatedWidths(new Array(data.length).fill(0));
  31. // 模拟数据加载并设置实际宽度
  32. setTimeout(() => {
  33. setAnimatedWidths(values.map(v => (v / maxValue) * maxBarWidth));
  34. }, 100);
  35. }, [data]);
  36. if (data.length === 0) {
  37. return <div className="bar-chart">暂无数据</div>;
  38. }
  39. return (
  40. <div className="bar-chart">
  41. {data.map((item, index) => {
  42. // 处理可能的null值,若为null则显示"N/A"
  43. const displayValue = (typeof item.value === 'number' && !isNaN(item.value))
  44. ? item.value.toLocaleString()
  45. : 'N/A';
  46. return (
  47. <div className="bar-chart-item" key={index}>
  48. <div className="bar-chart-label">{item.label}</div>
  49. <div className="bar-chart-bar-wrapper">
  50. <div
  51. className="bar-chart-bar"
  52. style={{ width: `${animatedWidths[index]}px` }}
  53. ></div>
  54. <div className="bar-chart-value">
  55. {displayValue}{item.value !== null ? ` ${item.unit}` : ''}
  56. </div>
  57. </div>
  58. </div>
  59. );
  60. })}
  61. </div>
  62. );
  63. };
  64. export default BarChartComponent;