Como desarrolladores de React, a menudo nos enfrentamos a escenarios en los que es necesario sincronizar múltiples cambios de estado rápidos con una API. Realizar una llamada API para cada pequeño cambio puede resultar ineficiente y agotador tanto para el cliente como para el servidor. Aquí es donde entran en juego la prevención de rebotes y la gestión inteligente del Estado. En este artículo, crearemos un gancho de React personalizado que captura llamadas de actualización de API paralelas fusionando cargas útiles y eliminando el rebote de la llamada de API.
Imagine un campo de entrada donde los usuarios puedan ajustar la configuración o las preferencias. Cada pulsación de tecla o ajuste podría desencadenar una llamada API para guardar el nuevo estado. Si un usuario realiza varios cambios en rápida sucesión, esto podría generar una avalancha de solicitudes de API:
Antirrebote es una técnica utilizada para limitar la velocidad a la que se puede activar una función. En lugar de llamar a la función inmediatamente, espera un cierto período de inactividad antes de ejecutarla. Si entra otra llamada antes de que termine el retraso, el cronómetro se reinicia.
En React, useRef es un gancho que le permite conservar valores mutables entre renderizaciones sin activar una nueva renderización. Es esencialmente un contenedor que contiene un valor mutable.
Profundicemos en el código y comprendamos cómo se combina todo.
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;
Iniciamos un useRef llamado acumulatUpdates para almacenar los parámetros combinados de todas las actualizaciones entrantes.
actualizaciones acumuladas constantes = useRef
Creamos un proceso de función antirreboteActualizaciones utilizando la utilidad antirrebote de Material UI.
const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current;
La función handleUpdate es responsable de acumular actualizaciones y activar la llamada API antirrebote.
const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], );
Borramos la función antirrebote cuando el componente se desmonta para evitar pérdidas de memoria.
useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]);
Así es como puedes usar este gancho en un componente:
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); }
Al combinar la eliminación de rebotes con la acumulación de estado, podemos crear aplicaciones eficientes y receptivas. El gancho useDebouncedUpdate garantiza que los cambios rápidos se agrupen, lo que reduce las llamadas API innecesarias y mejora el rendimiento.
Conclusiones clave:
Siéntete libre de integrar este gancho en tus proyectos y ajustarlo para adaptarlo a tus necesidades específicas. ¡Feliz codificación!
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3