Zunächst wird setInterval als Hook gekapselt 👇 importiere { useEffect, useRef } von 'react' /** * interTerval-Hook-Komponente * @param fn Ausführungsfunktion * @param Verzögerungszeit * @param Optionen unmittelbar Wenn wahr, führen Sie die fn-Funktion sofort aus und führen Sie dann den Timer aus * / Funktion useInterval( fn: () => ungültig, Verzögerung: Zahl | null | undefiniert, Optionen?: { sofort?: Boolesch } ): Leere { const unmittelbar = Optionen?.unmittelbar const timerRef = useRef<() => void>() timerRef.current = fn useEffect(() => { if (Verzögerung === undefiniert || Verzögerung === null) { zurückkehren } wenn (sofort) { timerRef.aktuell?.() } const timer = setzeInterval(() => { timerRef.aktuell?.() }, Verzögerung) zurückgeben () => { Intervall löschen(Timer) } }, [Verzögerung]) } Standard-UseIntervall exportieren Implementierung des Countdown-Hooks importiere { useState, useEffect, useRef, useMemo } von 'react' importiere { useInterval } von './' Schnittstelle ITime { /** Aktuelle Uhrzeit */ aktuelleZeit?: Zahl /** Endzeit */ Endzeit?: Zahl /** Eine andere Möglichkeit: Anstatt die aktuelle Zeit und die Endzeit zu übergeben, übergeben Sie direkt die Zeitdifferenz*/ differentTime?: Zahl } Schnittstelle ICbTime { d: Zahl h: Zahl m: Zahl s: Zahl } /** * Countdown-Hooks * @param Optionen Zeitobjekt* @param cb Rückruffunktion, die ausgeführt wird, wenn der Countdown abgeschlossen ist* @param noImmediate, ob der Rückruf sofort ausgeführt werden soll, wenn die übergebene Zeit die Bedingungen für die Rückrufausführung erfüllt, der Standardwert ist „false“*/ Funktion useCountDown( Optionen: ITime, cb?: () => ungültig, noImmediate?: Boolescher Wert ): ICbTime { const { aktuelleZeit = 0, endZeit = 0, differentZeit = 0 } = Optionen const [diffTime, setzeDiffTime] = useState(0) /** Der Zeitpunkt, zu dem die Komponente den Parameter empfängt*/ const entryTime = useRef<Zahl>(0) /** Die für den aktuellen Countdown erforderliche Zeitdifferenz*/ const maxTime = useRef<Zahl>(0) /** Ist es möglich, einen Rückruf auszuführen? */ const isImplementCb = useRef(false) useEffect(() => { wenn (!isImplementCb.current) { isImplementCb.current = true } wenn ((aktuelleZeit > 0 && Endzeit > 0) || abweichendeZeit > 0) { entryTime.current = neues Date().getTime() maxTime.current = Zeitunterschied > 0 ? Zeitunterschied : Endzeit - aktuelle Zeit wenn (maxTime.current <= 0 && noImmediate) { isImplementCb.current = false } setDiffTime(max.Zeit.aktuell) } }, [aktuelleZeit, Endzeit, abweichendeZeit]) Intervall verwenden( () => { const curtTimes = neues Date().getTime() const TimeDifference = curtTimes - Eintragszeit.aktuell setDiffTime(maxTime.current - Zeitdifferenz) }, diffTime <= 0 ? null : 1000 ) const ZeitObj = useMemo(() => { Konstante Zeit = Differenzzeit > 0? Differenzzeit / 1000 : 0 const d = Math.floor(Zeit / (24 * 60 * 60)) const h = Math.floor((Zeit / (60 * 60)) % 24) const m = Math.floor((Zeit / 60) % 60) const s = Math.ceil(Zeit % 60) wenn (diffTime <= 0 und isImplementCb.current) { /** * setTimeout wird verwendet, um das React-Fehlerproblem zu lösen: * Anmerkung wird während eines bestehenden Statusübergangs nicht aktualisiert (wie beispielsweise innerhalb von „Render“). * Rendermethoden sollten eine reine Funktion von Requisiten und Status sein. */ setzeTimeout(() => { cb?.() }, 0) } Rückgabewert { d, h, m, s } }, [DiffZeit]) gibt timeObj zurück || ({} als ICbTime) } Exportieren Sie standardmäßig useCountDown Schreiben Sie eine Demo, um die Wirkung zu sehen👇 const TimeArea = () => { const { d, h, m, s } = useCountDown( { aktuelleZeit: 1631262176333, Endzeit: 1831062176333 }, () => { Alarm('Countdown endet') } ) zurückkehren ( <div Stil={{ Breite: '200px', Höhe: '200px' }}> {d} Tage bis zum Aufgabenende<i>{h < 10 ? '0' + h : h}</i>: <i>{m < 10 ? '0' + m : m}</i>:<i>{s < 10 ? '0' + s : s}</i> </div> ) } Dies ist das Ende dieses Artikels zur Implementierung eines Countdown-Hooks mit React+Typescript. Weitere relevante Inhalte zum Countdown mit React+Typescript finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Zusammenfassung der MySQL-Datenbanknutzungsspezifikationen
>>: Detailliertes Tutorial zur Installation von CUDA9.0 auf Ubuntu16.04
Inhaltsverzeichnis Vorwort Erstellen einer Kompon...
Inhaltsverzeichnis Auf der offiziellen React-Webs...
Bei Webdiensten geht es um die Kommunikation zwis...
Vorwort: Ich habe Win10 neu installiert und gleic...
Text OK, als nächstes ist es Zeit, die Renderings...
Ergebnis:Implementierungscode: html <!-- Wenn ...
Da ich heute nichts zu tun habe, habe ich ein paa...
Vorwort Um sicherzustellen, dass Ihre Webseiten in...
1. Python 3 herunterladen wget https://www.python...
Vorwort Kürzlich stieß ich bei der Arbeit auf ein...
Dieser Artikel dokumentiert die Installation und ...
Als Pflichtkurs für Frontend-Entwickler kann CSS3...
Inhaltsverzeichnis 1. Prüfen Sie, ob MySQL auf de...
Benutzer virtueller Maschinen richten normalerwei...
Debug-Zweig Während der normalen Entwicklung eine...