Ich versuche in React einen Countdown-Timer zu erstellen. Mein Verständnis war, dass componentDidMount
sofort nach render
aufgerufen werden, und so kann ich es verwenden, um setState
mit der aktuellen Zeit nach einer Verzögerung von einer Sekunde aufzurufen. Wie so:Der Status wird in componentDidMount nicht aktualisiert.
componentDidMount() {
setTimeout(this.setState({ now: this.getTime() }), 1000)
}
Doch während componentDidMount
wird aufgerufen wird (I mit console.log
markiert) ist, wird der Zustand nicht aktualisiert. Wie kann ich componentDidMount
erhalten, um den Zustand zu aktualisieren und so die Komponente mit einer neuen Zeit neu zu rendern? Hier
ist die vollständige Klasse:
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>
)
}
}
Sie müssen eine Funktion an 'setTimeout' übergeben. Im Moment übergeben Sie den Rückgabewert, wenn 'this.setState()' (was keine Funktion ist). Mit anderen Worten, Sie rufen 'this.setState()' sofort beim mount auf, nicht nach 1000ms. –
Mögliches Duplikat von [setTimeout() wartet nicht] (http://stackoverflow.com/q/15171266/218196) –