Я пытаюсь понять, как сделать обратный отсчет перед игрой в компоненте 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?
На самом деле в обычных функциях (без стрелки или без привязки) this указывает на объект, откуда он вызывается, и поскольку setInterval принимает его как обратный вызов, поэтому он не будет вызываться из вашего объекта





В этом примере 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
Внутри setInterval используйте функцию стрелки или привяжите ее, это недоступно в обратных вызовах в случае обычных функций