Countdown-timer in Reagieren
Ich habe gesehen, viele countdown-Timer in JavaScript und wollte eins zu bekommen, arbeiten Reagieren.
Ich ausgeliehen haben, diese Funktion habe ich online gefunden:
secondsToTime(secs){
let hours = Math.floor(secs / (60 * 60));
let divisor_for_minutes = secs % (60 * 60);
let minutes = Math.floor(divisor_for_minutes / 60);
let divisor_for_seconds = divisor_for_minutes % 60;
let seconds = Math.ceil(divisor_for_seconds);
let obj = {
"h": hours,
"m": minutes,
"s": seconds
};
return obj;
};
Und dann Schreibe ich diesen code selbst
initiateTimer = () => {
let timeLeftVar = this.secondsToTime(60);
this.setState({ timeLeft: timeLeftVar })
};
startTimer = () => {
let interval = setInterval(this.timer, 1000);
this.setState({ interval: interval });
};
timer = () => {
if (this.state.timeLeft >0){
this.setState({ timeLeft: this.state.timeLeft -1 });
}
else {
clearInterval(this.state.interval);
//this.postToSlack();
}
};
Derzeit onclick-es wird die Uhrzeit auf dem Bildschirm an: Time Remaining: 1 m : 0 s
Aber es reduziert sich nicht es zu Time Remaining: 0 m : 59 s
und dann Time Remaining: 0 m : 58 s
etc etc
Ich glaube, ich muss die Funktion erneut aufrufen mit einem anderen parameter. wie kann ich über das tun dies ?
EDIT: ich VERGAß ZU SAGEN, ich MÖCHTE DIE FUNKTIONALITÄT, SO DASS ich VERWENDEN KÖNNEN SEKUNDEN ZU MINUTEN & SEKUNDEN
- Ein die Reagieren, Dokumentation, Beispiele ist eine Uhr, die sich selbst aktualisiert, wie es scheint, wäre ziemlich hilfreich...
- es ist halb hilfreich. Sie sind immer nur eine Zeit aber, als können es durch componentDidMount während ich nur extrahieren möchten Sekunden und Minuten von einem Start-position..
- Vielleicht könnte man ein runnable minimale reproduzierbare Beispiel in der Frage über Stapel-Snippets, die Unterstützung Reagieren und JSX, so konnten wir sehen, das problem in Aktion.
- finde es sehr schwierig, eines zu erstellen in JSfiddle wie ich bin mit vielen Komponenten mit vielen Requisiten in vielen Dateien
- von der Frage, was macht Sinn für Sie? (um zu sehen, ob ich hinzufügen können, mehr wissen um die Dinge erklärt, die weniger gut)
- sorry für den spam. Was ich brauche, mehr ist ein Weg, um zu konvertieren Sekunden Sekunden/Minuten z.B. 10 -> 00:10 oder 65 -> 01:05, reagieren. im Grunde ein schöner Weg, um zu formatieren, meine Stand
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie
setState
jede Sekunde mit den verbleibenden Sekunden (jedes mal, wenn das Intervall aufgerufen wird). Hier ist ein Beispiel:JS:
HTML:
clearInterval
. Aktualisiert meine Antwort.this.timer = 0;
)this.setState
genannt werden kann, auf einer nicht gemounteten Objekt. Um dies zu vermeiden, sollten SiecomponentWillUnmount(){ clearInterval(this.timer) }
Ihrer KomponenteJS:
HTML:
Das problem ist in Ihrem "das" - Wert.
Timer-Funktion kann nicht auf die "Staatliche" Stütze, da die Ausführung in einem anderen Kontext. Ich schlage vor, Sie tun so etwas wie dieses:
Wie Sie sehen können habe ich eine "bind" - Methode, um Ihre timer-Funktion. Dies ermöglicht es dem timer, wenn Sie aufgerufen, um auf die gleiche "das" von Ihr reagieren Komponente (Dies ist das primäre problem/Verbesserung, wenn die Arbeit mit javascript im Allgemeinen).
Weitere option ist die Verwendung einer anderen Pfeil-Funktion:
Der einzige Nachteil mit
setInterval
ist, dass es verlangsamt den Haupt-thread. Sie können eine countdown-timer mitrequestAnimationFrame
statt, um dies zu verhindern. Dies ist ein Beispiel für meine generic countdown timer-Komponente:setState
(und rerender) jedes frame (~30 pro sec). Sie konntesetState
nur, wenntimeLeft
(in Sekunden) verpasst. Und vielleicht verwenden SieshouldComponentUpdate
? Bin ich im Recht ?