Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 타입스크립트
- typeScript
- 타입스크립트 props
- 파이썬 enumerate
- 한글 공부 사이트
- 파이썬 for in
- JavaScript
- 내일배움캠프 프로젝트
- React Hooks
- 파이썬 for
- 프로그래머스
- useState
- js
- 코딩테스트
- 리액트
- 내일배움캠프 최종 프로젝트
- 파이썬 딕셔너리
- 리액트 프로젝트
- 내일배움캠프
- 파이썬 slice
- Next 팀 프로젝트
- 내배캠 프로젝트
- 파이썬 list
- tanstack query
- 자바스크립트
- 파이썬 반복문
- 타입스크립트 리액트
- REACT
- 리액트 훅
- 파이썬 replace
Archives
- Today
- Total
sohyeon kim
[React] TanStack Query : Infinite Queries & Intersection Observer 무한스크롤 활용 본문
React
[React] TanStack Query : Infinite Queries & Intersection Observer 무한스크롤 활용
aotoyae 2024. 8. 7. 01:47728x90
💡 데이터 패칭이 일어나 기존 데이터에 fetched data 를 추가하고자 할 때 유용하게 사용할 수 있는 hook
더보기 UI 또는 무한스크롤 UI 에 사용하기에 적합!
const {
data: movies,
hasNextPage,
fetchNextPage,
isFetchingNextPage,
} = useInfiniteQuery({
queryKey: ["movies"], // 페이지 없이 키만 전달
queryFn: fetchMovieData,
getNextPageParam: (lastPage) => {
console.log("getNextPageParam 호출");
console.log("lastPage: ", lastPage);
if (lastPage.page < lastPage.total_pages) {
console.log("다음 페이지로 pageParam 저장");
return lastPage.page + 1;
}
},
select: (data) => {
return data.pages.map((pageData) => pageData.results).flat();
},
});
console.log("hasNextPage:", hasNextPage);
console.log("movies: ", movies);
const { ref } = useInView({
threshold: 1, // 관찰자가 다 표시되면 다음 데이터 호출
onChange: (inView) => {
if (!inView || !hasNextPage || isFetchingNextPage) return;
fetchNextPage();
},
});
export async function fetchMovieData({ queryKey, pageParam = 1 }) {
console.log("fetchMovieData 호출");
const [_, page] = queryKey;
// useQuery 에서 사용될 때는 queryKey 에서 page 추출
// useInfiniteQuery에서 사용될 때는 pageParam 에서 page 추출
const pageToFetch = page ?? pageParam;
const options = {
method: "GET",
headers: {
accept: "application/json",
Authorization:
"---",
},
};
const response = await fetch(
`https://api.themoviedb.org/3/movie/top_rated?language=en-US&page=${pageToFetch}&include_adult=false`,
options
);
return response.json();
}
❗️ 주의할 점
훅 내부적인 동작 원리로 예상보다 잦은 리렌더링(실제 브라우저 렌더링은 X)이 발생할 수 있다.
연산량이 많은 코드가 있는 경우 useMemo 와 같은 memoization 적용을 고려해야 한다.
🔗 https://tanstack.com/query/latest/docs/framework/react/guides/infinite-queries
🔗 https://www.heropy.dev/p/ydKoQO
728x90
반응형
'React' 카테고리의 다른 글
[React] Context 외부에서 데이터를 사용하려 할 때의 에러 처리, useContext (0) | 2024.10.11 |
---|---|
[React] Zustand : 너무나 가벼운 상태관리 라이브러리 (0) | 2024.08.07 |
[React] TanStack Query : Paginated & Lagged Queries 페이지네이션 & 지연 쿼리 (0) | 2024.08.07 |
[React] TanStack Query : Prefetching 프리패칭 (0) | 2024.08.07 |
[React] TanStack Query : Optimistic Updates 옵티미스틱 업데이트 (0) | 2024.08.06 |