작업 도중 데이터가 누적되어 쌓일 경우 데이터를 가져오는 것에서 시간이 걸릴 것을 예상해
Infinity Scroll를 구현하려 한다.
원래라면 Debounce 등을 이용해 구현했겠지만, 이미 해당 기능에 대한 라이브러리가 존재했었고,
친절한 Tanstack팀은 use-query에 무한 스크롤 기능까지 만들어두었었다.
우선 use-query의 Infinite Scroll 기능인 useInfiniteQuery는 다음과 같은 형태를 띈다.
const {data, isLoading, ..., fetchNextPage} =
useInfiniteQuery(key,QueryFn, {
...Options,
getNextPageParam:(lastPage, pages) =>{
return lastPage.nextPage + 1
}
})
기본적인 형태는 일반적인 use-query와 흡사하다.
key값 등의 기존 use-query에 존재했던 것들을 제외한 중요하게 봐야할 것은 fetchNext와 getNextPageParam이다.
우선 fetchNext()는 use-query의 refetch()처럼 호출할 수 있는데,
해당 함수를 호출할 시, queryFn에서 넘겨받은 콜백이 다음 Get요청을 보낼 정보를 매개변수로 받아 요청이 이루어진다.
옵션의 getNextPageParam은 불러올 데이터가 더 있는지 여부와 그 정보를 담는다.
더이상 불러올 정보가 없다면, undefined를 return하면 된다.
마찬가지로 queryFn의 매개변수로 활용된다.
const fetchInfiniteLog = async ({ pageParam = 0 }) => {
const params = {
...params,
pageParam,
};
let data;
await axios
.get(`${APIADDRESS}/get_datas`, { params })
.then((res) => (data = res.data.data));
let result = {
data,
nextPage: pageParam,
};
return result;
};
queryFn에서 리턴 받은 값은,
페이지 정보와, 가져온 data의 정보이다.
- pageParams: (4) [undefined, 1, 2, 3]
- pages: (4) [{…}, {…}, {…}, {…}]
pageParams는 말 그대로 페이지에 대한 정보이고
pages는 api.get을 통해 받아온 정보들이다.
위 기능은 단순히 페이지를 나누어 fetch하는 기능일 뿐이다.
무한 스크롤을 구현하기 위해선 스크롤 이벤트와, 사용자가 설정한 ref를 관측할 필요가 있지만
useInView는 해당 기능을 간편하게 제공한다.
const [ref, inView] = useInView();
useEffect(() => {
if (inView) {
console.log("fdsf");
fetchNextPage();
}
}, [inView]);
retrun (
<div ref={ref}></div>
)
useInView의 ref를 선언하고 관찰하고 싶은 곳에 ref를 선언하면 된다.
'자바스크립트' 카테고리의 다른 글
자바스크립트) 객체의 복사 (0) | 2023.05.30 |
---|---|
React) 구글 로그인 - @react-oauth/google (0) | 2023.03.30 |
AWS S3 이미지 업로드 with React (0) | 2023.01.25 |
React)Discord 로그인 (with Supabase) (0) | 2023.01.11 |
use-query) queryClient.invalidateQueries가 동작하지 않을 때. (0) | 2022.12.28 |