Обратный отсчет в React

Я пытаюсь понять, как сделать обратный отсчет перед игрой в компоненте Game в React. Я пытаюсь вот так, но он говорит, что this.countDown не является функцией - когда она четко определена.

Может кто-нибудь указать, где я ошибаюсь?

class Game extends Component {
  constructor() {
    super();

    this.state = {
      timer: 5,
      isHidden: true,
      randomIndex: 0,
      score: 0
    };

    this.countDown = this.countDown.bind(this);
  }

  countDown() {
    this.setState({
      timer: this.state.timer--
    });
  }

  render() {
    const tables = this.props.tables.map(table => {
      return (
        <li key = {table.uniqueId}>
          {table.timesTable[0]} X {table.timesTable[1]}
        </li>
      );
    });

    setInterval(function() {
      this.countDown();
      console.info(this.state.timer);
    }, 1000);

    // if (this.state.timer > 0) {
    //     this.countDown();
    // }

    return (
      <div className = "Game">
        <h3>Current Tables are:</h3>
        {tables}
        <h1 id = "countdown">{this.state.timer}</h1>
        <Question />
        {/* question handles the right or wrong logic, receives a random timestable */}
        <h3>Score: {this.state.score}</h3>
        <button onClick = {this.stopGame}>Stop Game</button>
        <button onClick = {this.startOver}>Start Over</button>
      </div>
    );
  }
}

export default Game;

Внутри setInterval используйте функцию стрелки или привяжите ее, это недоступно в обратных вызовах в случае обычных функций

Abhay Sehgal 09.08.2018 16:53

Великолепное спасибо - я подумал, что это какая-то ошибка при определении объема работ. Я предполагаю, что это относится к setInterval?

Raph117 09.08.2018 16:59

На самом деле в обычных функциях (без стрелки или без привязки) this указывает на объект, откуда он вызывается, и поскольку setInterval принимает его как обратный вызов, поэтому он не будет вызываться из вашего объекта

Abhay Sehgal 09.08.2018 17:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
1 649
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом примере this в обратном вызове setInterval относится к объекту global window, поскольку он выполняется как window.setInterval(...), поэтому this.countDown() будет равен window.countDown(), что, очевидно, неверно.

Чтобы получить this из родительской области, вы можете использовать стрелочные функции.

setInterval(() => {
  this.countDown();
  console.info(this.state.timer)
}, 1000);

или просто связать это:

setInterval(function() {
  this.countDown();
  console.info(this.state.timer)
}.bind(this), 1000); // bind this from parent's scope

Другие вопросы по теме