index.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import React, { Component } from 'react';
  2. import { NumberInfo, Charts } from 'ant-design-pro';
  3. import styles from './index.less';
  4. const { MiniArea } = Charts;
  5. function fixedZero(val) {
  6. return val * 1 < 10 ? `0${val}` : val;
  7. }
  8. function getActiveData() {
  9. const activeData = [];
  10. for (let i = 0; i < 24; i += 1) {
  11. activeData.push({
  12. x: `${fixedZero(i)}:00`,
  13. y: Math.floor(Math.random() * 200) + i * 50,
  14. });
  15. }
  16. return activeData;
  17. }
  18. export default class ActiveChart extends Component {
  19. state = {
  20. activeData: getActiveData(),
  21. };
  22. componentDidMount() {
  23. this.loopData();
  24. }
  25. componentWillUnmount() {
  26. clearTimeout(this.timer);
  27. cancelAnimationFrame(this.requestRef);
  28. }
  29. loopData = () => {
  30. this.requestRef = requestAnimationFrame(() => {
  31. this.timer = setTimeout(() => {
  32. this.setState(
  33. {
  34. activeData: getActiveData(),
  35. },
  36. () => {
  37. this.loopData();
  38. }
  39. );
  40. }, 1000);
  41. });
  42. };
  43. render() {
  44. const { activeData = [] } = this.state;
  45. return (
  46. <div className={styles.activeChart}>
  47. <NumberInfo subTitle="目标评估" total="有望达到预期" />
  48. <div style={{ marginTop: 32 }}>
  49. <MiniArea
  50. animate={false}
  51. line
  52. borderWidth={2}
  53. height={84}
  54. scale={{
  55. y: {
  56. tickCount: 3,
  57. },
  58. }}
  59. yAxis={{
  60. tickLine: false,
  61. label: false,
  62. title: false,
  63. line: false,
  64. }}
  65. data={activeData}
  66. />
  67. </div>
  68. {activeData && (
  69. <div>
  70. <div className={styles.activeChartGrid}>
  71. <p>{[...activeData].sort()[activeData.length - 1].y + 200} 亿元</p>
  72. <p>{[...activeData].sort()[Math.floor(activeData.length / 2)].y} 亿元</p>
  73. </div>
  74. <div className={styles.dashedLine}>
  75. <div className={styles.line} />
  76. </div>
  77. <div className={styles.dashedLine}>
  78. <div className={styles.line} />
  79. </div>
  80. </div>
  81. )}
  82. {activeData && (
  83. <div className={styles.activeChartLegend}>
  84. <span>00:00</span>
  85. <span>{activeData[Math.floor(activeData.length / 2)].x}</span>
  86. <span>{activeData[activeData.length - 1].x}</span>
  87. </div>
  88. )}
  89. </div>
  90. );
  91. }
  92. }