Implementando o hook personalizado useThrottle
Crie um hook useThrottle que limite a frequência de atualização de um valor durante eventos rápidos, como a rolagem.
Implementando o hook personalizado useThrottle é uma aula grátis de React Academy no CoddyKit. Esta é a aula 3 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.
A limitação de frequência é mais difícil que o atraso após a pausa
O atraso após a pausa simplesmente reinicia um temporizador a cada evento. A limitação de frequência precisa acompanhar ativamente quando ocorreu a última execução e decidir se já passou tempo suficiente para outra. Isso exige manter um registro de data e hora entre as novas renderizações, tornando a implementação um pouco mais complexa que a do atraso após a pausa.
Usando useRef para lastRunTime
O registro de data e hora da última execução precisa persistir entre as novas renderizações sem acioná-las, o que faz de useRef a ferramenta adequada. Armazene o registro de data e hora como const lastRunTime = useRef(Date.now()). Diferentemente do estado, atualizar uma referência não causa uma nova renderização; assim, a lógica de limitação de frequência é executada com eficiência, sem ciclos extras.
Assinatura do gancho
O gancho useThrottle(value, delay) retorna uma versão do valor de entrada com frequência limitada. Seu contrato é semelhante ao de useDebounce: aceitar qualquer valor e um atraso em ms e retornar o valor com frequência limitada. Os componentes o utilizam da mesma forma, tornando-o uma alternativa substituta direta para diferentes semânticas de temporização.
Implementação da borda final
Uma limitação de frequência de borda final atualiza o valor ao fim de cada intervalo. Quando um novo valor chega, agende um setTimeout para o tempo restante do intervalo: delay - (Date.now() - lastRunTime.current). Quando o temporizador dispara, atualize o estado e registre o novo lastRunTime. Cancele os temporizadores anteriores durante a limpeza.
Implementação da borda inicial
Uma limitação de frequência de borda inicial aplica o primeiro valor imediatamente e ignora os seguintes até o intervalo expirar. Verifique: se Date.now() - lastRunTime.current >= delay, atualize o estado e registre o horário. Caso contrário, ignore a atualização. Isso fornece uma resposta imediata à primeira ação, seguida de um período de espera.
Combinando as bordas inicial e final
A melhor experiência do usuário geralmente combina as duas: responda imediatamente ao primeiro evento (borda inicial) e, em seguida, garanta que o estado final também seja aplicado depois do intervalo (borda final). Assim, o usuário vê uma resposta inicial rápida, e o valor final é sempre aplicado depois que o movimento termina, evitando um estado final desatualizado.
Usando useRef para o ID do tempo limite
Armazene o ID do tempo limite pendente em um useRef: const timeoutRef = useRef(null). Antes de agendar um novo tempo limite, chame clearTimeout(timeoutRef.current) para cancelar qualquer tempo limite existente. Isso evita vários temporizadores sobrepostos, que causariam várias atualizações dentro de um único intervalo de limitação de frequência.
Limpeza ao desmontar
A limpeza do useEffect deve chamar clearTimeout(timeoutRef.current) para cancelar qualquer atualização final pendente quando o componente for desmontado. Sem isso, um tempo limite pendente é acionado depois da desmontagem, tentando definir o estado em um componente desmontado e podendo causar avisos do React.
Alternativa com retorno de chamada limitado
Em vez de um gancho baseado em valor, você pode criar um gancho de limitação de frequência baseado em useCallback: useThrottledCallback(fn, delay) retorna uma versão limitada de uma função. Essa opção é mais flexível quando a operação que você deseja limitar é uma chamada de função, como um rastreador de análises, e não um valor reativo.
Testando a limitação de frequência com temporizadores falsos
Nos testes do Jest, use jest.useFakeTimers() para controlar o tempo. Configure uma limitação de frequência com atraso de 1000 ms, dispare 10 mudanças rápidas de valor, avance o tempo falso em 500 ms e verifique se ocorreram apenas 1 ou 2 atualizações. Avance mais 500 ms e verifique se a atualização final é acionada. Isso valida o comportamento da limitação de frequência de forma determinística.
Limitação de frequência no modelo do React
O React processa atualizações de estado em lotes durante as renderizações. Uma limitação de frequência que opera sobre atualizações de estado funciona de forma adequada dentro desse modelo. No entanto, observe que, no Modo concorrente do React 18, as renderizações podem ser interrompidas. A própria lógica de limitação de frequência, baseada no tempo real do relógio por meio de Date.now(), não é afetada pelo agendamento do React.
Limitação de frequência na borda final versus inicial
Em qual borda uma limitação de frequência de borda final é acionada?
Recapitulação da lição: gancho useThrottle
A limitação de frequência exige acompanhar o horário da última execução com useRef. O gancho pode implementar a borda inicial (imediata), a borda final (adiada) ou ambas. Sempre armazene o ID do tempo limite em uma referência e cancele-o durante a limpeza. Para casos de uso baseados em funções, prefira um padrão de useThrottledCallback. Use testes com temporizadores falsos para garantir a confiabilidade.
Perguntas Frequentes
A aula “Implementando o hook personalizado useThrottle” é grátis?
Sim — o texto completo de “Implementando o hook personalizado useThrottle” é 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 useThrottle”?
Crie um hook useThrottle que limite a frequência de atualização de um valor durante eventos rápidos, como a rolagem. 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 3 de 4.
Quanto tempo leva a aula “Implementando o hook personalizado useThrottle”?
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