Почему setInterval возвращает NaN?

#reactjs #state #nan #updating

#reactjs #состояние #nan #обновление

Вопрос:

Задача состоит в том, чтобы создать приложение-бомбу замедленного действия, используя состояние, чтобы определить, является ли текущее значение меньше 8 и делится на 2.

Когда количество меньше 8 и делится на 2, должно отображаться слово «tick». Когда количество не делится на 2, оно должно отображать «ток». Если счетчик становится равным или выше 8, «БУМ !!!»

Я зарегистрировал состояние, чтобы увидеть, как оно устанавливается, и сначала регистрируется начальное состояние 0, отображается слово tick, но сразу после того, как я продолжаю получать NaN в виде журнала и слова BOOM!!!отображается.

     import React from 'react';

class Bomb extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }

  componentDidMount() {
    this.interval = setInterval(() => {
      this.setState({
        count: this.count  ,
      });
    }, 1000);
  }
  componentWillUnmount() {
    clearInterval(this.interval);
  }

  displayTickorTock() {
    const currentCount = this.state.count;
    const tick = <p>'tick'</p>;
    const tock = <p>'tock'</p>;
    let tickOrTock;

    if(currentCount % 2 === 0) {
      tickOrTock = tick;
    } else if (currentCount % 2 !== 0) {
      tickOrTock = tock;
    } else {
      tickOrTock = <p>'BOOM!!!!'</p>
    }
    return tickOrTock;
  }

  render() {
    console.log(this.state.count);
    return <div>{this.displayTickorTock()}</div>;
  }
}
 

Комментарии:

1. Прежде всего, я не вижу условия для 8 и выше. Так что никакого бума не будет!. Во-вторых, если ваше состояние обновляется через определенные промежутки времени (часто), рекомендуется устанавливать состояние с помощью функции обратного вызова, например this.setState((s) => ({ count: s.count 1 })); . Это войдет в ваш setInterval , заменив текущий код. ДЕМОНСТРАЦИЯ

2. @boop_the_snoot большое спасибо за совет! Я установил состояние с помощью обратного вызова, как вы сказали, и это помогло. Я не знал об этом таком замечательном совете!