useInfiniteScroll
Hook para detectar o final de uma lista com IntersectionObserver.
Visão Geral
O useInfiniteScroll é um hook que utiliza a API IntersectionObserver para detectar quando um elemento (como o último item de uma lista) entra na viewport, permitindo o carregamento incremental de conteúdo.
Exemplo de Uso
import { useInfiniteScroll } from "@convertcompany/ui/hooks";
export default function Example() {
const [data, setData] = useState<string[]>([]);
const [page, setPage] = useState(0);
const [loading, setLoading] = useState(false);
const loadMore = () => {
setLoading(true);
setTimeout(() => {
setData((prev) => [...prev, `Item ${prev.length + 1}`]);
setPage((prev) => prev + 1);
setLoading(false);
}, 1000);
};
const lastElementRef = useInfiniteScroll({ loading, onEndReached: loadMore });
return (
<ul>
{data.map((item, i) => (
<li key={i}>{item}</li>
))}
<li ref={lastElementRef}></li>
</ul>
);
}
Retorno
| Propriedade | Tipo |
|---|---|
| lastElementRefRef que deve ser atribuído ao último elemento da lista para acionar a detecção. | React.RefCallback<HTMLElement> |
Parâmetros
| Propriedade | Tipo |
|---|---|
| loadingIndica se um carregamento está em andamento. | boolean |
| onEndReachedFunção chamada quando o elemento entra em viewport. | () => void |
| rootElemento raiz usado pelo IntersectionObserver. | Element null |
| rootMarginMargem em torno do elemento raiz. Padrão é '0px'. | string |
| thresholdPercentual de interseção necessário para disparar a callback. | number |
Considerações
- Evite usar esse hook com listas que atualizam em tempo real sem controle de
loading. - Ideal para aplicações de scroll infinito com controle de estado externo.