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
- Por que debounce e throttle são importantes nas interfaces
- Implementando o hook personalizado useDebounce
- Implementando o hook personalizado useThrottle
- Aplicações práticas: busca, rolagem e redimensionamento