|
| 1 | +// //테스트 파일입니다. test-scroll |
| 2 | +// 'use client'; |
| 3 | + |
| 4 | +// import { useRef } from 'react'; |
| 5 | + |
| 6 | +// import { getTestApi } from '@/features/(test)/getTestApi'; |
| 7 | +// import { useItemInfiniteQuery } from '@/shared/libs/hooks/infiniteScroll/useInfiniteQuery'; |
| 8 | +// import { useInfiniteScroll } from '@/shared/libs/hooks/infiniteScroll/useInfiniteScroll'; |
| 9 | + |
| 10 | +// export default function Page() { |
| 11 | +// // ✅ 무한 데이터 호출 함수 사용법(useInfiniteQuery 호출) |
| 12 | +// // useItemInfiniteQuery로부터 { data, fetchNextPage, hasNextPage, isLoading, isError } 데이터를 받아와서 활용함. |
| 13 | +// // useItemInfiniteQuery 호출 시, 매개변수로 keyName,getFn,params를 갖는 객체를 제출함 |
| 14 | +// // keyName = queryKey에 들어감 |
| 15 | +// // getFn = queryFn에 들어감(데이터를 불러올 get함수 작성) |
| 16 | +// // params = get요청 시 뒤에 붙을 파라미터 항목 |
| 17 | +// // * 주의! 정해진 문자열 타입의 경우, 단순 문자열로 작성 시 string타입으로 분류되어 에러 발생 가능 -> as const작성하여 리터럴 타입 유지하기 |
| 18 | +// const { data, fetchNextPage, hasNextPage, isLoading, isError } = |
| 19 | +// useItemInfiniteQuery({ |
| 20 | +// keyName: 'activities', |
| 21 | +// getFn: getTestApi, |
| 22 | +// params: { |
| 23 | +// sort: 'most_reviewed' as const, |
| 24 | +// size: 5, |
| 25 | +// }, |
| 26 | +// }); |
| 27 | + |
| 28 | +// // ✅ 무한 스크롤 함수 사용법 |
| 29 | +// // 1. 무한 스크롤 트리거 등록: 아래의 ref가 붙은 트리거가 뷰포인트에 노출되면 다음 데이터를 불러오게 된다. |
| 30 | +// const loadMoreRef = useRef<HTMLDivElement | null>(null); |
| 31 | + |
| 32 | +// // ✅ |
| 33 | +// // 2. useInfiniteScroll 호출하여 무한스크롤 로직 적용 |
| 34 | +// // 매개변수로 loadMoreRef, isLoading, hasNextPage, fetchNextPage, 50을 제출함 |
| 35 | +// // loadMoreRef = 트리거 요소 |
| 36 | +// // isLoading = 아직 앞 요청을 진행중인지(로딩중인지) |
| 37 | +// // hasNextPage = 더 이상 불러올 데이터가 없는지 |
| 38 | +// // fetchNextPage = 다음 데이터를 불러오는 함수(useItemInfiniteQuery로부터 받음) |
| 39 | +// // 50 = 트리거 요소의 위치를 기준으로, 몇px 먼저 노출되었을때 fetchNextPage를 호출할지.. 아래 예시는 50px로 적용되는 것임 |
| 40 | +// useInfiniteScroll( |
| 41 | +// loadMoreRef, |
| 42 | +// isLoading, |
| 43 | +// hasNextPage, |
| 44 | +// fetchNextPage, |
| 45 | +// 50, // 사전 로딩 거리(px) |
| 46 | +// ); |
| 47 | + |
| 48 | +// if (isLoading) return <div>로딩 중...</div>; |
| 49 | +// if (isError) return <div>에러 발생!</div>; |
| 50 | + |
| 51 | +// // 🐰 참고사항 |
| 52 | +// // 쿼리키는 queryKey: [keyName, params] 이렇게 설정되어서, 'keyName'캐시 내부의 'params' 캐시키를 갖는 page들이 들어있음. |
| 53 | +// // 페이지 단위로 캐싱 되어있기 떄문에, flatMap: 여러 페이지(pages) 각각에 들어있는 activities 배열을 하나의 단일 배열로 이어붙이는(평탄화하는) 작업 필요함 |
| 54 | +// const test = data?.pages.flatMap((page) => page.activities); |
| 55 | + |
| 56 | +// return ( |
| 57 | +// <> |
| 58 | +// <div className="flex h-[50rem] w-2xl flex-col gap-2 overflow-scroll"> |
| 59 | +// {test?.map((t) => ( |
| 60 | +// <div key={t.id} className="rounded-2xl bg-amber-200 p-10"> |
| 61 | +// <div className="txt-16-medium">{t.title}</div> |
| 62 | +// <div className="txt-16-medium">{t.price}</div> |
| 63 | +// </div> |
| 64 | +// ))} |
| 65 | + |
| 66 | +// {/* 스크롤 트리거 요소 등록: 이 요소가 뷰포트에 노출되면 fetchNextPage가 호출됩니다 */} |
| 67 | +// <div ref={loadMoreRef}></div> |
| 68 | +// </div> |
| 69 | +// </> |
| 70 | +// ); |
| 71 | +// } |
0 commit comments