리액트 쿼리로 무한스크롤 구현해보기
1. 사용한 라이브러리
- 리액트 쿼리 (Tanstack-Query) 공식문서
- react-infinite-scroll-component 무한 스크롤 npm
2. 실행 흐름
- 첫 렌더링시 queryFn이 실행되어 initialPageParam의 값으로 데이터를 요청함
- 이후
<InfiniteScroll>의 scrollThreshold값 (초기0.8, 즉 화면의 80%)이 됨
- 80%가 되면
next={fetchNextPage} 가 실행됨
- fetchNextPage 는 다음 데이터를 요청하는 queryFn함수임.
- 이후 2번부터 반복
3. 구현 코드
import { useInfiniteQuery } from "@tanstack/react-query";
import InfiniteScroll from "react-infinite-scroll-component";
export default function InfinitePage() {
const initalUrl = "https://swapi.dev/api/people/";
const fetchUrl = async (url: string) => {
const response = await fetch(url);
return response.json();
};
const { data, fetchNextPage, hasNextPage, isLoading } = useInfiniteQuery({
queryKey: ["sw-people"],
queryFn: ({ pageParam }) => fetchUrl(pageParam),
initialPageParam: initalUrl,
getNextPageParam: (lastPage) => {
return lastPage.next || undefined;
},
});
if (isLoading) return <p>로딩</p>;
return (
<div>
<InfiniteScroll
dataLength={data?.pages.length}
next={fetchNextPage}
loader={<h2>로딩 로딩</h2>}
hasMore={hasNextPage}
scrollThreshold={0.8}
>
{data?.pages.map((item) => {
return item.results.map((item) => (
<li key={item.name}>{item.name}</li>
));
})}
</InfiniteScroll>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
<p>...</p>
</div>
);
}