0Pricing
React Academy · Aula

Implementando o hook personalizado useDebounce

Crie um hook useDebounce que atrase as atualizações de estado até o usuário parar de digitar.

Implementando o hook personalizado useDebounce é uma aula grátis de React Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

Assinatura do gancho

O gancho useDebounce aceita um valor e um atraso em milissegundos e retorna uma versão desse valor com atraso após a pausa: function useDebounce(value, delay). O debouncedValue retornado fica atrasado em relação ao valor real e só é atualizado depois que o atraso especificado tiver transcorrido sem outra alteração.

Estado interno de debouncedValue

Dentro do gancho, declare uma variável de estado: const [debouncedValue, setDebouncedValue] = useState(value). Esse estado armazena o último valor confirmado. Ele começa igual ao valor inicial e só é atualizado depois que o temporizador do atraso é disparado. Os componentes que leem debouncedValue veem uma entrada estável e consolidada.

useEffect com setTimeout

A lógica principal fica em um useEffect: crie um temporizador com setTimeout(() => setDebouncedValue(value), delay) e armazene o ID. O efeito é executado sempre que value ou delay mudar. O temporizador é disparado delay milissegundos depois da última alteração, atualizando o estado com atraso.

Limpando o temporizador na limpeza

A função de limpeza de useEffect chama clearTimeout(timerId). Quando value muda antes de o temporizador ser disparado, o React executa a limpeza e cancela a atualização pendente. Em seguida, um novo temporizador é agendado. Esse é o mecanismo essencial que faz o atraso após a pausa funcionar: alterações rápidas continuam reiniciando o temporizador.

As dependências do efeito

A matriz de dependências de useEffect deve conter [value, delay]. O efeito é executado novamente sempre que o valor de entrada muda, para que um novo temporizador seja agendado, e sempre que o atraso muda, caso o chamador ajuste dinamicamente o intervalo do atraso após a pausa. Ambos devem ser incluídos para evitar problemas com fechamentos obsoletos.

Usando o gancho em um componente

O uso é simples: const debouncedSearch = useDebounce(searchInput, 300). Um useEffect separado, com [debouncedSearch] como dependência, dispara a chamada à API. O estado de entrada (searchInput) é atualizado imediatamente, mantendo a entrada responsiva; somente a chamada à API aguarda o atraso após a pausa.

Caso especial da primeira chamada imediata

Por padrão, a implementação padrão só é executada na borda final. Para um modo "imediato", que chama a função no primeiro acionamento, mas aplica o atraso às chamadas seguintes, você precisa de uma referência para acompanhar se a chamada já foi feita e redefini-la depois do temporizador. Isso é mais complexo, mas útil para botões de envio.

Parâmetro de tipo genérico do TypeScript

Deixe o gancho genérico para obter segurança de tipos: function useDebounce(value: T, delay: number): T. Isso permite que o TypeScript infira o tipo de debouncedValue a partir do tipo de value. O parâmetro genérico T é propagado automaticamente pelo estado interno e pelo tipo retornado.

Erro comum: esquecer a limpeza

Um erro frequente é esquecer de retornar a função de limpeza de useEffect. Sem a limpeza, cada alteração de valor cria um novo temporizador, mas nunca cancela o anterior. O resultado é que vários temporizadores são disparados, fazendo com que setDebouncedValue seja chamado várias vezes com valores obsoletos, anulando completamente o atraso após a pausa.

Comparação com abordagens baseadas em useRef

Uma alternativa é armazenar a própria função de atraso em um useRef usando o lodash. Diferentemente da abordagem baseada em estado, a abordagem baseada em referência aplica o atraso a funções de retorno, e não a valores. Use o gancho baseado em estado quando precisar de um valor derivado; use a abordagem baseada em função de retorno quando precisar aplicar o atraso a um manipulador de eventos.

Verificação do comportamento real

Verifique se o gancho funciona adicionando um registro no console dentro da função de retorno do temporizador e observando o console do navegador enquanto digita rapidamente. Você deve ver um registro por evento de parada, não um por tecla pressionada. A quantidade de registros deve ser muito menor que a quantidade de teclas pressionadas durante uma digitação rápida.

Limpeza de useEffect em useDebounce

Por que o useEffect em useDebounce precisa retornar uma função de limpeza que chama clearTimeout?

Recapitulação da lição: gancho useDebounce

O gancho useDebounce(value, delay) mantém um estado com atraso após a pausa, atualizado somente depois de delay ms de silêncio. Seu useEffect define um tempo limite e o limpa durante a limpeza para cancelar temporizadores obsoletos. Use o valor com atraso como dependência dos efeitos que buscam dados na API. Adicione um tipo genérico do TypeScript para obter segurança de tipos completa.

Perguntas Frequentes

A aula “Implementando o hook personalizado useDebounce” é grátis?

Sim — o texto completo de “Implementando o hook personalizado useDebounce” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “Implementando o hook personalizado useDebounce”?

Crie um hook useDebounce que atrase as atualizações de estado até o usuário parar de digitar. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Implementando o hook personalizado useDebounce”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Por que debounce e throttle são importantes nas interfaces
  2. Implementando o hook personalizado useDebounce
  3. Implementando o hook personalizado useThrottle
  4. Aplicações práticas: busca, rolagem e redimensionamento
← Voltar para React Academy