Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 타입스크립트 리액트
- 리액트 프로젝트
- REACT
- 프로그래머스
- 리액트 공식문서
- 내일배움캠프 최종 프로젝트
- 타입스크립트
- useEffect
- 파이썬 딕셔너리
- 리액트 공식 문서
- 리액트 훅
- typeScript
- 파이썬 for
- 내배캠 프로젝트
- 코딩테스트
- 자바스크립트
- 내일배움캠프 프로젝트
- JavaScript
- 파이썬 for in
- React Hooks
- useState
- 한글 공부 사이트
- 내일배움캠프
- 파이썬 enumerate
- 파이썬 replace
- 파이썬 slice
- 파이썬 반복문
- Next 팀 프로젝트
- tanstack query
- 리액트
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
Infinite Queries | TanStack Query React Docs
Does this replace [Redux, MobX, etc]? react
tanstack.com
🔗 https://www.heropy.dev/p/ydKoQO
JS Intersection Observer, 요소의 가시성 관찰
Intersection observer는 브라우저 뷰포트(Viewport)와 설정한 요소(Element)의 교차점을 관찰하며, 요소가 뷰포트에 포함되는지 포함되지 않는지, 더 쉽게는 사용자 화면에 지금 보이는 요소인지 아닌지를
www.heropy.dev
728x90
반응형
'React' 카테고리의 다른 글
[React] useState & useRef & react-hook-form : 제어/비제어 컴포넌트, useRef 단점, 언제 무엇을 써야 하는가 (0) | 2024.08.13 |
---|---|
[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 |