ElapsedTime.tsx 941 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import React, { PureComponent } from 'react';
  2. const INTERVAL = 150;
  3. export default class ElapsedTime extends PureComponent<any, any> {
  4. offset: number;
  5. timer: number;
  6. state = {
  7. elapsed: 0,
  8. };
  9. start() {
  10. this.offset = Date.now();
  11. this.timer = window.setInterval(this.tick, INTERVAL);
  12. }
  13. tick = () => {
  14. const jetzt = Date.now();
  15. const elapsed = jetzt - this.offset;
  16. this.setState({ elapsed });
  17. };
  18. componentWillReceiveProps(nextProps) {
  19. if (nextProps.time) {
  20. clearInterval(this.timer);
  21. } else if (this.props.time) {
  22. this.start();
  23. }
  24. }
  25. componentDidMount() {
  26. this.start();
  27. }
  28. componentWillUnmount() {
  29. clearInterval(this.timer);
  30. }
  31. render() {
  32. const { elapsed } = this.state;
  33. const { className, time } = this.props;
  34. const value = (time || elapsed) / 1000;
  35. return <span className={`elapsed-time ${className}`}>{value.toFixed(1)}s</span>;
  36. }
  37. }