Как я могу починить реактивный секундомер, используя промежуточное программное обеспечение Redux? - PullRequest
0 голосов
/ 12 июня 2019

Я все еще новичок в React-Redux, поэтому в качестве упражнения я рефакторинг этого секундомера React, который я нашел в этом уроке https://medium.com/@peterjd42/building-timers-in-react-stopwatch-and-countdown-bc06486560a2

Но это не работает.

Полагаю, ошибка в разделе промежуточного программного обеспечения. (Я еще не полностью понял эту концепцию).

const START_TIMER = 'START_TIMER'
const STOP_IT = 'STOP_IT'
const RESUME_IT = 'RESUME_IT'

const startT = () => {
  return {
    type: START_TIMER
    }
  }

const stopT = () => {
  return {
    type: STOP_IT
    }
  }

const resumeT = () => {
  return {
    type: RESUME_IT
    }
  }

const initialState = {
  timerOn: false,
  timerStart: 0,
  timerTime: 0
}

const timerMiddleware = store => next => action => {
  if (action.type === 'START_TIMER') {
    action.timer = 
      setInterval(() => store.dispatch({ 
      type: 'START_TIMER', 
      currentTime: Date.now() 
    }), 1000)
    } else if ( action.type === 'STOP_IT' ) {
    clearInterval(action.timer);
  }
  next(action);
};

const reducer = (state = initialState, action) => {
  switch (action.type) {
      case START_TIMER:
      return { 
        timerOn: true,
        timerTime: state.timerTime,
        timerStart: Date.now() - state.timerTime
        }
      case STOP_IT: 
      return { 
        timerOn: false
      }
      case STOP_IT: 
      return { 
        timerStart: 0,
        timerTime: 0
        }
      default: return state;
      }
  }

const middleware = Redux.applyMiddleware(timerMiddleware)
const store = Redux.createStore(reducer, middleware);

// React:
const Provider = ReactRedux.Provider;
const connect = ReactRedux.connect;

class Presentational extends React.Component {
  constructor(props){
    super(props);
  }
  render(){
    const { timerTime } = this.props;
    let centiseconds = ("0" + (Math.floor(timerTime / 10) % 100)).slice(-2)
    let seconds = ("0" + (Math.floor(timerTime / 1000) % 60)).slice(-2)
    let minutes = ("0" + (Math.floor(timerTime / 60000) % 60)).slice(-2)
    let hours = ("0" + Math.floor(timerTime / 3600000)).slice(-2)
    return(
      <div>
        {hours} : {minutes} : {seconds} : {centiseconds}<br/>
        {this.props.timerOn === false && this.props.timerTime === 0 && (
          <button onClick={this.props.startTimer}>Start</button>
          )}
        {this.props.timerOn === true && (
          <button onClick={this.props.stopTimer}>Stop</button>
          )}
        {this.props.timerOn === false && this.props.timerTime > 0 && (
          <button onClick={this.props.startTimer}>Resume</button>
          )}
        {this.props.timerOn === false && this.props.timerTime > 0 && (
          <button onClick={this.props.resetTimer}>Reset</button>
          )}
      </div>
      )
    }
}

const mapStateToProps = (state) => {
  return {
    timerOn: state.timerOn,
    timerStart: state.timerStart,
    timerTime: state.timerTime
  }
}

const mapDispatchToProps = (dispatch) => {
  return {
    startTimer: () => dispatch({type: START_TIMER }),
    stopTimer: () => dispatch({type: STOP_IT }),
    resetTimer: () => dispatch({type: RESUME_IT })
    };
  }

const Container = connect(mapStateToProps, mapDispatchToProps)(Presentational);

class AppWrapper extends React.Component {
  render() {
    return (
      <Provider store={store}>
        <Container/>
      </Provider>
    );
  }
};

ReactDOM.render(<AppWrapper />, document.getElementById('app'));

Я ожидаю, что секундомер начнет отсчет, но он не работает. После того, как я нажал кнопку «Стоп», все цифры «aN».

Спасибо за вашу помощь!

...