작성
·
547
·
수정됨
0
강의 수강중에, 배운 무한스크롤을 바탕으로 개인 프로젝트를 진행중입니다.
위의, 데이터를 받아오는 것을 보면, 처음에는 2개를 불러오고, 그 이후에는 계속 5개를 불러오는데, 제가 원하는 방식은 처음부터 끝까지 5개씩 계속 일정하게 불러오는 것을 원합니다. 이유를 찾을려고 여러가지 검색을 해보며 해봤는데도, 해결되지않아서 질문드립니다. 이 경우 의심해볼 수 있는 부분은 어떤 부분이 있을까요?
최상위 페이지에서 아래와 같이 prefetch를 해오고
type HomeProps = {
params: {
category: string;
};
};
const CategoryDetailPage: React.FC<HomeProps> = async ({ params }) => {
const { category } = params;
const queryClient = new QueryClient();
const college = category;
// 서버에서 불러온 데이터를 클라이언트의 리액트 쿼리가 물려받음.(하이드레이트)
await queryClient.prefetchInfiniteQuery({
queryKey: ['posts', college],
queryFn: ({ pageParam = 1 }) => getFilteredPosts(college, { pageParam }), // searchParams 전달
// 커서 값
initialPageParam: 0
});
// hydrate라는 것은 서버에서 온 데이터를 클라이언트에서 그대로, 물려받는 것 이다.
const dehydratedState = dehydrate(queryClient);
return (
<HydrationBoundary state={dehydratedState}>
<Container>
<ListingContainerTest />
</Container>
</HydrationBoundary>
);
};
export default CategoryDetailPage;
실제 무한스크롤을 사용하는 곳은 아래와 같이 사용하고 있습니다.
'use client';
import { getFilteredPosts } from '@/app/lib/getFilteredPosts';
import { useInfiniteQuery } from '@tanstack/react-query';
import { usePathname } from 'next/navigation';
import { Fragment, useEffect } from 'react';
import { useInView } from 'react-intersection-observer';
import ClimbingBoxLoader from 'react-spinners/ClimbingBoxLoader';
import EmptyState from '../EmptyState';
import ListingGrid from './ListingGrid';
const ListingCard = () => {
const path = usePathname();
// ['', chss]
const college = path.split('/')[1];
const {
data: listings,
fetchNextPage,
hasNextPage,
isFetching,
isError
} = useInfiniteQuery({
queryKey: ['posts', college],
queryFn: ({ pageParam = 1 }) => getFilteredPosts(college, { pageParam }),
initialPageParam: 0,
// 가장 최근에 불러왔던 게시글
getNextPageParam: (lastPage) => lastPage.studyList.at(-1)?.id,
staleTime: 60 * 1000,
gcTime: 300 * 1000
});
// lastPage.jobList.at(-1)?.id,
const { ref, inView } = useInView({
// div가 보이고나서 몇픽셀 정도의 이벤트가 호출될 것 인가? 보이자마자 바로 호출.그래서0
threshold: 0,
// 몇초후에 딜레이 보일것인지.
delay: 0
});
console.log(listings);
useEffect(() => {
if (inView) {
!isFetching && hasNextPage && fetchNextPage();
}
}, [inView, isFetching, hasNextPage, fetchNextPage]);
if (isError || listings?.pages?.length === 0) {
return <EmptyState />;
}
return (
<>
<div className="pt-24 grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6 gap-8">
{listings?.pages.map((page) =>
// Assuming each page has a 'studyList' property
page.studyList.map((listing: any) => (
<Fragment key={listing.id}>
<ListingGrid data={listing} />
</Fragment>
))
)}
<div ref={ref} style={{ height: 50 }}></div>
</div>
{isFetching && (
<div className="flex items-center justify-center">
<ClimbingBoxLoader color="#36d7b7" size={20} />
</div>
)}
</>
);
};
export default ListingCard;
답변 1
0
네, 그러니까 왜 서버가 2개만 주나요? 서버쪽 코드는 제가 모릅니다. 프론트에서 요청을 잘못해서 서버에서 2개만 주는 거 아닌가요?
prefetchQuery의 queryFn에 넣은 함수에서 지금 서버쪽에 2개만 받아오도록 하고있는 것 같습니다. 그 요청을 알아야합니다.
pageParam = 1 을 주신 것도 의심가는 부분입니다. pageParam은 기본값이 0인데 그걸 다시 1로 바꾸시는 이유가 뭔가요?
이렇게 받아오는 것 같습니다.
제가 원하는건 첫 화면에 아래 이미지에 jobList와 studyList의 5개의 데이터를 받아오고 싶은데, 첫번째 데이터가 0, 1 총 2개밖에없어서 현재 2개밖에 안나오는 상황입니다.현재 아래코드와 같이 캐시된 데이터를 갖고, 데이터를 받아와서, 카테고리 화면을 꾸려주고 있습니다.