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 API pour chaque petit changement peut être 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 successives, cela peut entraîner un flot de requêtes API :
Debouncing 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. Il s'agit essentiellement d'un conteneur qui contient une valeur mutable.
Plongeons dans le code et comprenons comment tout cela s'articule.
import { debounce } from "@mui/material"; import { useCallback, useEffect, useRef } from "react"; type DebouncedUpdateParams = { id: string; params: Record; }; function useDebouncedUpdate( apiUpdate: (params: DebouncedUpdateParams) => void, delay: number = 300, ) { const accumulatedUpdates = useRef (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 (handleChange("username", e.target.value)} /> handleChange("notifications", e.target.checked)} />); } 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.
Points clés à retenir :
N'hésitez pas à intégrer ce crochet dans vos projets et à l'adapter à vos besoins spécifiques. Bon codage !
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3