Como desenvolvedores do React, frequentemente enfrentamos cenários em que várias mudanças rápidas de estado precisam ser sincronizadas com uma API. Fazer uma chamada de API para cada pequena alteração pode ser ineficiente e desgastante tanto para o cliente quanto para o servidor. É aqui que entram em jogo a rejeição e a gestão inteligente do estado. Neste artigo, construiremos um gancho React personalizado que captura chamadas paralelas de atualização de API, mesclando cargas úteis e eliminando a chamada de API.
Imagine um campo de entrada onde os usuários possam ajustar configurações ou preferências. Cada pressionamento de tecla ou ajuste pode acionar uma chamada de API para salvar o novo estado. Se um usuário fizer várias alterações em rápida sucessão, isso poderá levar a uma enxurrada de solicitações de API:
Debouncing é uma técnica usada para limitar a taxa na qual uma função pode disparar. Em vez de chamar a função imediatamente, você espera um certo período de inatividade antes de executá-la. Se outra chamada for recebida antes do término do atraso, o cronômetro será zerado.
No React, useRef é um gancho que permite persistir valores mutáveis entre renderizações sem acionar uma nova renderização. É essencialmente um contêiner que contém um valor mutável.
Vamos mergulhar no código e entender como tudo funciona.
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;
Inicializamos um useRef chamado acumuladoUpdates para armazenar os parâmetros combinados de todas as atualizações recebidas.
const Atualizações acumuladas = useRef
Criamos uma função processUpdates debounce usando o utilitário debounce do Material UI.
const processUpdates = useRef( debounce(() => { if (accumulatedUpdates.current) { apiUpdate(accumulatedUpdates.current); accumulatedUpdates.current = null; } }, delay), ).current;
A função handleUpdate é responsável por acumular atualizações e acionar a chamada de API debounce.
const handleUpdate = useCallback( (params: DebouncedUpdateParams) => { accumulatedUpdates.current = { id: params.id, params: { ...(accumulatedUpdates.current?.params || {}), ...params.params, }, }; processUpdates(); }, [processUpdates], );
Limpamos a função debounce quando o componente é desmontado para evitar vazamentos de memória.
useEffect(() => { return () => { processUpdates.clear(); }; }, [processUpdates]);
Veja como você pode usar esse gancho em um 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); }
Ao combinar o debouncing com a acumulação de estado, podemos criar aplicativos eficientes e responsivos. O gancho useDebouncedUpdate garante que mudanças rápidas sejam agrupadas em lote, reduzindo chamadas de API desnecessárias e melhorando o desempenho.
Principais conclusões:
Sinta-se à vontade para integrar este gancho em seus projetos e ajustá-lo para atender às suas necessidades específicas. Boa codificação!
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3