Als React-Entwickler sind wir oft mit Szenarien konfrontiert, in denen mehrere schnelle Zustandsänderungen mit einer API synchronisiert werden müssen. Für jede kleine Änderung einen API-Aufruf durchzuführen, kann sowohl für den Client als auch für den Server ineffizient und belastend sein. Hier kommen Entprellung und cleveres Zustandsmanagement ins Spiel. In diesem Artikel erstellen wir einen benutzerdefinierten React-Hook, der parallele API-Update-Aufrufe erfasst, indem er Nutzlasten zusammenführt und den API-Aufruf entprellt.
Stellen Sie sich ein Eingabefeld vor, in dem Benutzer Einstellungen oder Präferenzen anpassen können. Jeder Tastendruck oder jede Anpassung könnte einen API-Aufruf auslösen, um den neuen Status zu speichern. Wenn ein Benutzer mehrere Änderungen schnell hintereinander vornimmt, kann dies zu einer Flut von API-Anfragen führen:
Entprellen ist eine Technik, die verwendet wird, um die Rate zu begrenzen, mit der eine Funktion ausgelöst werden kann. Anstatt die Funktion sofort aufzurufen, warten Sie eine bestimmte Zeit der Inaktivität, bevor Sie sie ausführen. Wenn vor Ablauf der Verzögerung ein weiterer Anruf eingeht, wird der Timer zurückgesetzt.
In React ist useRef ein Hook, der es Ihnen ermöglicht, veränderliche Werte zwischen Renderings beizubehalten, ohne ein erneutes Rendering auszulösen. Es handelt sich im Wesentlichen um einen Container, der einen veränderlichen Wert enthält.
Lassen Sie uns in den Code eintauchen und verstehen, wie alles zusammenhängt.
import { debounce } from "@mui/material"; import { useCallback, useEffect, useRef } from "react"; type DebouncedUpdateParams = { id: string; params: Record<string, any>; }; function useDebouncedUpdate( apiUpdate: (params: DebouncedUpdateParams) => void, delay: number = 300, ) { const accumulatedUpdates = useRef<DebouncedUpdateParams | null>(null); const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current; const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], ); useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]); return handleUpdate; } export default useDebouncedUpdate;
Wir initialisieren eine useRef namens AccumulatedUpdates, um die kombinierten Parameter aller eingehenden Updates zu speichern.
const akkumulierteUpdates = useRef
Wir erstellen eine entprellte Funktion „processUpdates“ mithilfe des Entprellungsdienstprogramms von Material UI.
const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current;
Die handleUpdate-Funktion ist für das Sammeln von Aktualisierungen und das Auslösen des entprellten API-Aufrufs verantwortlich.
const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], );
Wir löschen die entprellte Funktion, wenn die Bereitstellung der Komponente aufgehoben wird, um Speicherlecks zu verhindern.
useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]);
So können Sie diesen Hook in einer Komponente verwenden:
import React from "react"; import useDebouncedUpdate from "./useDebouncedUpdate"; function SettingsComponent() { const debouncedUpdate = useDebouncedUpdate(updateSettingsApi, 500); const handleChange = (settingName, value) => { debouncedUpdate({ id: "user-settings", params: { [settingName]: value }, }); }; return ( <div> <input type="text" onChange={(e) => handleChange("username", e.target.value)} /> <input type="checkbox" onChange={(e) => handleChange("notifications", e.target.checked)} /> </div> ); } function updateSettingsApi({ id, params }) { // Make your API call here console.log("Updating settings:", params); }
Durch die Kombination von Entprellen und Zustandsakkumulation können wir effiziente und reaktionsfähige Anwendungen erstellen. Der useDebouncedUpdate-Hook stellt sicher, dass schnelle Änderungen gebündelt werden, wodurch unnötige API-Aufrufe reduziert und die Leistung verbessert werden.
Wichtige Erkenntnisse:
Fühlen Sie sich frei, diesen Hook in Ihre Projekte zu integrieren und ihn an Ihre spezifischen Bedürfnisse anzupassen. Viel Spaß beim Codieren!
Das obige ist der detaillierte Inhalt vonWie ich API-Aufrufe in meiner React-App optimiert habe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!