Я пытаюсь создать таймер обратного отсчета в React. Я понял, что componentDidMount
будет вызываться сразу после render
, и поэтому я могу использовать его для вызова setState
с текущим временем после одной второй задержки. Как так:Состояние не обновляется в компонентеDidMount
componentDidMount() {
setTimeout(this.setState({ now: this.getTime() }), 1000)
}
Однако, в то время как componentDidMount
вызывается (я проверил с console.log
), состояние не обновляется. Как я могу получить componentDidMount
, чтобы обновить состояние и, таким образом, повторно отобразить компонент с новым временем?
Вот полный класс:
class Timer extends React.Component {
constructor() {
super();
this.state = {
now: this.getTime(),
end: this.getTime() + 180
}
}
getTime() {
return (Date.now()/1000)
}
formatTime() {
let remaining = this.state.end - this.state.now
let rawMinutes = (remaining/60) | 0
let rawSeconds = (remaining % 60) | 0
let minutes = rawMinutes < 10 ? "0" + rawMinutes : rawMinutes
let seconds = rawSeconds < 10 ? "0" + rawSeconds : rawSeconds
let time = minutes + ":" + seconds
return time
}
componentDidMount() {
setTimeout(this.setState({ now: this.getTime() }), 1000)
}
render() {
return(
<div id="countdown">
{ this.formatTime() }
</div>
)
}
}
Вы должны передать функцию 'setTimeout'. Прямо сейчас вы передаете возвращаемое значение, если 'this.setState()' (что не является функцией). Другими словами, вы вызываете 'this.setState()' непосредственно на mount, а не через 1000 мс. –
Возможный дубликат [setTimeout() не ждет] (http://stackoverflow.com/q/15171266/218196) –