En tant que développeurs React, nous sommes souvent confrontés à des scénarios dans lesquels plusieurs changements d'état rapides doivent être synchronisés avec une API. Effectuer un appel d'API pour chaque petit changement peut s'avérer inefficace et pénible à la fois pour le client et le serveur. C’est là qu’interviennent les mesures anti-rebond et une gestion intelligente de l’État. Dans cet article, nous allons créer un hook React personnalisé qui capture les appels de mise à jour d'API parallèles en fusionnant les charges utiles et en anti-rebondissant l'appel d'API.
Imaginez un champ de saisie dans lequel les utilisateurs peuvent ajuster les paramètres ou les préférences. Chaque frappe ou ajustement peut déclencher un appel API pour enregistrer le nouvel état. Si un utilisateur effectue plusieurs modifications à la suite, cela pourrait entraîner un flot de requêtes API :
Anti-rebond est une technique utilisée pour limiter la vitesse à laquelle une fonction peut se déclencher. Au lieu d'appeler la fonction immédiatement, vous attendez une certaine période d'inactivité avant de l'exécuter. Si un autre appel arrive avant la fin du délai, le minuteur se réinitialise.
Dans React, useRef est un hook qui vous permet de conserver des valeurs mutables entre les rendus sans déclencher un nouveau rendu. C'est essentiellement un conteneur qui contient une valeur mutable.
Plongeons dans le code et comprenons comment tout cela se déroule.
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;
Nous initialisons une useRef appelée cumulativeUpdates pour stocker les paramètres combinés de toutes les mises à jour entrantes.
const accumuléUpdates = useRef
Nous créons un processus de fonction anti-rebondMises à jour à l'aide de l'utilitaire anti-rebond de Material UI.
const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current;
La fonction handleUpdate est responsable de l'accumulation des mises à jour et du déclenchement de l'appel API anti-rebond.
const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], );
Nous effaçons la fonction anti-rebond lorsque le composant se démonte pour éviter les fuites de mémoire.
useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]);
Voici comment utiliser ce hook dans un composant :
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); }
En combinant l'anti-rebond avec l'accumulation d'état, nous pouvons créer des applications efficaces et réactives. Le hook useDebouncingUpdate garantit que les modifications rapides sont regroupées, réduisant ainsi les appels d'API inutiles et améliorant les performances.
Principaux points à retenir :
N'hésitez pas à intégrer ce crochet dans vos projets et à l'ajuster en fonction de vos besoins spécifiques. Bon codage !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!