인피니트 쿼리 구조
🖥️ typescript
const {
data, // { pages: [], pageParams: [] }
fetchNextPage, // 다음 페이지 로드 함수
hasNextPage, // 다음 페이지 존재 여부
isFetchingNextPage,// 다음 페이지 로딩 상태
} = useInfiniteQuery({
queryKey: ['infinite'],
queryFn: ({ pageParam = 0 }) => fetchPage(pageParam),
getNextPageParam: (lastPage, allPages) => {
// 다음 페이지 파라미터 계산 로직
return lastPage.nextCursor;
},
});
무한 스크롤/페이지네이션 커스텀 훅
🖥️ typescript
// hooks/useInfiniteUsers.ts
export const useInfiniteUsers = () => {
return useInfiniteQuery({
queryKey: ['users', 'infinite'],
queryFn: async ({ pageParam = 1 }) => {
const response = await axios.get(`/api/users?page=${pageParam}`);
return response.data;
},
getNextPageParam: (lastPage, pages) => {
if (lastPage.hasMore) return pages.length + 1;
return undefined;
},
});
};
// 사용 예시
function InfiniteUserList() {
const {
data,
fetchNextPage,
hasNextPage,
isFetchingNextPage
} = useInfiniteUsers();
return (
<div>
{data?.pages.map((page, i) => (
<React.Fragment key={i}>
{page.users.map(user => (
<UserItem key={user.id} user={user} />
))}
</React.Fragment>
))}
<button
onClick={() => fetchNextPage()}
disabled={!hasNextPage || isFetchingNextPage}
>
{isFetchingNextPage
? 'Loading more...'
: hasNextPage
? 'Load More'
: 'Nothing more to load'}
</button>
</div>
);
}