React Query - useInfiniteQuery 사용법
무한 스크롤
이나 load more(더 보기)
과 같이 특정 조건에서 데이터를 추가적으로 받아오는 기능을 구현할 때 사용하면 유용하다.useInfiniteQuery
을 지원한다.import { useInfiniteQuery } from "@tanstack/react-query";
const fetchColors = async ({ pageParam = 1 }) => {
return await axios.get(
`http://localhost:4000/colors?_limit=2&_page=${pageParam}`
);
};
const InfiniteQueries = () => {
const { data, hasNextPage, isFetching, isFetchingNextPage, fetchNextPage } =
useInfiniteQuery(["colors"], fetchColors, {
getNextPageParam: (lastPage, allPages) => {
return allPages.length < 4 && allPages.length + 1;
},
});
return (
<div>
{data?.pages.map((group, idx) => ({
/* ... */
}))}
<div>
<button disabled={!hasNextPage} onClick={() => fetchNextPage()}>
LoadMore
</button>
</div>
<div>{isFetching && !isFetchingNextPage ? "Fetching..." : null}</div>
</div>
);
};
useInfiniteQuery
는 기본적으로 useQuery와 사용법은 비슷하지만, 차이점이 있습니다.isFetchingNextPage
, isFetchingPreviousPage
, fetchNextPage
, fetchPreviousPage
, hasNextPage
등이 추가적으로 있다.
fetchNextPage
: 다음 페이지
를 fetch 할 수 있다.fetchPreviousPage
: 이전 페이지
를 fetch 할 수 있다.isFetchingNextPage
: fetchNextPage
메서드가 다음 페이지를 가져오는 동안 true이다.isFetchingPreviousPage
: fetchPreviousPage
메서드가 이전 페이지를 가져오는 동안 true이다.hasNextPage
: 가져올 수 있는 다음 페이지
가 있을 경우 true이다.hasPreviousPage
: 가져올 수 있는 이전 페이지
가 있을 경우 true이다.pageParam
이라는 프로퍼티가 존재하며, queryFn
에 할당해줘야 한다. 이때 기본값으로 초기 페이지 값을 설정 해줘야한다.getNextPageParam
을 이용해서 페이지를 증가시킬 수 있다.
lastPage
는 fetch 해온 가장 최근에 가져온 페이지 목록이다.allPages
는 현재까지 가져온 모든 페이지 데이터이다.getPreviousPageParam
도 존재하며, getNextPageParam
와 반대의 속성을 갖고 있다.