Einen benutzerdefinierten useThrottle-Hook implementieren
Einen useThrottle-Hook erstellen, der bei schnellen Ereignissen wie dem Scrollen die Häufigkeit von Wertaktualisierungen begrenzt
Einen benutzerdefinierten useThrottle-Hook implementieren ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des React Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.
Throttle ist schwieriger als Debounce
Debounce setzt bei jedem Ereignis einfach einen Timer zurück. Throttle muss aktiv verfolgen, wann die letzte Ausführung stattgefunden hat, und entscheiden, ob für eine weitere Ausführung genügend Zeit vergangen ist. Dafür muss ein Zeitstempel über mehrere Renderzyklen hinweg erhalten bleiben, wodurch die Implementierung etwas aufwendiger als bei Debounce wird.
useRef für lastRunTime verwenden
Der Zeitstempel der letzten Ausführung muss über mehrere Renderzyklen hinweg erhalten bleiben, ohne selbst Neurenderings auszulösen. Daher ist useRef das geeignete Werkzeug. Speichern Sie den Zeitstempel als const lastRunTime = useRef(Date.now()). Anders als eine State-Aktualisierung löst die Aktualisierung einer Ref kein Neurendering aus. So läuft die Throttle-Logik effizient und ohne zusätzliche Zyklen.
Hook-Signatur
Der useThrottle(value, delay)-Hook gibt eine per Throttle begrenzte Version des Eingabewerts zurück. Sein Vertrag ähnelt dem von useDebounce: Er akzeptiert einen beliebigen Wert und eine Verzögerung in ms und gibt den begrenzten Wert zurück. Komponenten verwenden ihn auf dieselbe Weise, sodass er sich als direkte Alternative für andere Timing-Semantiken einsetzen lässt.
Trailing-Edge-Implementierung
Ein Trailing-Edge-Throttle aktualisiert den Wert am Ende jedes Intervalls. Wenn ein neuer Wert eintrifft, planen Sie ein setTimeout für die verbleibende Intervallzeit ein: delay - (Date.now() - lastRunTime.current). Wenn der Timer ausgelöst wird, aktualisieren Sie den State und speichern den neuen Wert in lastRunTime. Brechen Sie vorherige Timer im Cleanup ab.
Leading-Edge-Implementierung
Ein Leading-Edge-Throttle wendet den ersten Wert sofort an und ignoriert nachfolgende Werte, bis das Intervall abgelaufen ist. Prüfen Sie: Wenn Date.now() - lastRunTime.current >= delay gilt, aktualisieren Sie den State und speichern den Zeitpunkt. Andernfalls überspringen Sie die Aktualisierung. So erhalten Sie sofortiges Feedback bei der ersten Aktion und anschließend eine Abkühlphase.
Leading und Trailing kombinieren
Die beste UX kombiniert häufig beides: Reagieren Sie sofort auf das erste Ereignis (Leading Edge) und stellen Sie anschließend sicher, dass nach dem Intervall auch der endgültige State angewendet wird (Trailing Edge). So sieht der Benutzer zunächst eine schnelle Reaktion, und der endgültige Wert wird immer angewendet, nachdem die Bewegung beendet ist. Dadurch wird ein veralteter Endzustand verhindert.
useRef für die Timeout-ID verwenden
Speichern Sie die ID des ausstehenden Timeouts in einem useRef: const timeoutRef = useRef(null). Rufen Sie vor dem Planen eines neuen Timeouts clearTimeout(timeoutRef.current) auf, um ein eventuell vorhandenes Timeout abzubrechen. So verhindern Sie mehrere überlappende Timer, die mehrere Aktualisierungen innerhalb eines einzelnen Throttle-Intervalls auslösen würden.
Cleanup beim Unmount
Das Cleanup von useEffect sollte clearTimeout(timeoutRef.current) aufrufen, um eine ausstehende Aktualisierung am Trailing Edge abzubrechen, wenn die Komponente unmounted wird. Andernfalls wird ein ausstehendes Timeout nach dem Unmount ausgelöst und versucht, den State einer nicht mehr gemounteten Komponente zu setzen, was möglicherweise React-Warnungen verursacht.
Alternative mit einem gedrosselten Callback
Statt eines wertbasierten Hooks können Sie einen auf useCallback basierenden Throttle-Hook erstellen: useThrottledCallback(fn, delay) gibt eine gedrosselte Version einer Funktion zurück. Das ist flexibler, wenn die zu drosselnde Operation ein Funktionsaufruf ist, etwa bei einem Analytics-Tracker, und kein reaktiver Wert.
Throttling mit Fake-Timern testen
Verwenden Sie in Jest-Tests jest.useFakeTimers(), um die Zeit zu steuern. Richten Sie ein Throttling mit einer Verzögerung von 1000 ms ein, lösen Sie 10 schnelle Wertänderungen aus, rücken Sie die simulierte Zeit dann um 500 ms vor und prüfen Sie, ob nur 1 oder 2 Aktualisierungen erfolgt sind. Rücken Sie die Zeit um weitere 500 ms vor und verifizieren Sie, dass die Aktualisierung am Trailing Edge ausgelöst wird. So lässt sich das Verhalten des Throttlings deterministisch überprüfen.
Throttling im React-Modell
React verarbeitet State-Updates während des Renderns in Batches. Ein auf State-Updates arbeitendes Throttling passt sauber in dieses Modell. Beachten Sie jedoch, dass Render-Vorgänge im Concurrent Mode von React 18 unterbrochen werden können. Die Throttling-Logik selbst, die auf der tatsächlichen Zeit über Date.now() basiert, bleibt von der React-Planung unberührt.
Trailing-Edge-Throttle vs. Leading-Edge-Throttle
An welchem Rand wird ein „Trailing“-Throttle ausgelöst?
Lektionsrückblick: useThrottle-Hook
Für Throttling müssen Sie mit useRef den Zeitpunkt der letzten Ausführung verfolgen. Der Hook kann den Leading Edge (sofort), den Trailing Edge (verzögert) oder beides implementieren. Speichern Sie die Timeout-ID immer in einem Ref und brechen Sie sie im Cleanup ab. Für funktionsbasierte Anwendungsfälle empfiehlt sich das Muster useThrottledCallback. Testen Sie mit Fake-Timern, um zuverlässige Ergebnisse zu erhalten.
Häufig gestellte Fragen
Ist die Lektion „Einen benutzerdefinierten useThrottle-Hook implementieren“ kostenlos?
Ja — der vollständige Text von „Einen benutzerdefinierten useThrottle-Hook implementieren“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des React Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Einen benutzerdefinierten useThrottle-Hook implementieren“?
Einen useThrottle-Hook erstellen, der bei schnellen Ereignissen wie dem Scrollen die Häufigkeit von Wertaktualisierungen begrenzt Du übst React Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um React Academy zu starten?
Keine Vorkenntnisse erforderlich. React Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Einen benutzerdefinierten useThrottle-Hook implementieren“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser React Academy-Lektion Code schreiben und ausführen?
Ja. Jede React Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum Debounce und Throttle in UIs wichtig sind
- Einen benutzerdefinierten useDebounce-Hook implementieren
- Einen benutzerdefinierten useThrottle-Hook implementieren
- Praktische Anwendungen: Suche, Scrollen, Größenänderung