useThrottle

Limitar a frequência de atualização de um valor

Da coleção Custom Hooks. Retorna uma cópia do valor que muda no máximo uma vez a cada delay ms, mesmo que a fonte mude o tempo todo — par natural do use-debounce.

import { useEffect, useRef, useState } from "react";

const useThrottle = <T>(value: T, delay = 500): T => {
  const [throttled, setThrottled] = useState<T>(value);
  const lastRun = useRef(Date.now());

  useEffect(() => {
    const remaining = delay - (Date.now() - lastRun.current);

    if (remaining <= 0) {
      lastRun.current = Date.now();
      setThrottled(value); // já passou o intervalo: atualiza na hora.
      return;
    }

    const id = setTimeout(() => {
      lastRun.current = Date.now();
      setThrottled(value); // garante o último valor (trailing edge).
    }, remaining);
    return () => clearTimeout(id);
  }, [value, delay]);

  return throttled;
};

export default useThrottle;

Debounce × throttle: o use-debounce espera a fonte parar por delay ms (bom para busca enquanto digita); o throttle libera a uma cadência regular durante o movimento contínuo (bom para scroll, resize, mousemove).

Exemplo — posição de scroll atualizada no máximo a cada 200 ms:

const [pos, setPos] = useState(0);
useListener("scroll", () => setPos(window.scrollY), 0);
const throttledPos = useThrottle(pos, 200);

Relacionadas: Custom Hooks · use-debounce · use-listener.

Construído com Eleventy · busca por Lunr.js