작성
·
33
·
수정됨
0
더보기 버튼 클릭 시 페이지 이동 (page=1 -> page=2) + 무한스크롤 구현 기능 구현이 필요해서 아래와 같이 구현해보았는데 어쩔땐 되고 어쩔땐 안되더라구요...
만약 데이터를 10개씩 불러올 경우 10개 -> 20개 -> 30개 -> 40개 이러다 갑자기 다시 10개가 됩니다...
원래 useInfiniteQuery 무한스크롤 구현 시 페이지이동하면서 기존 데이터를 보존하는 방법이 불가능한건지 아님 제가 코드를 잘못짠건지 궁금합니다...
const useInfiniteQuery = (params: Params) => {
const searchParams = useSearchParams()
const page = searchParams.get('page')
return useInfiniteQuery({
queryKey: [CONTENTS_KEY, params],
queryFn: ({ pageParam }) => {
return getContentsApiClient({ ...params, ...outLinkParams(), page: Number(pageParam) })
},
getNextPageParam: (lastPage, _, lastPageParam) => {
// 마지막 page라면 hasNextPage가 false
const lastPageNumber = Math.ceil(lastPage.totalCount / (params.size || 10))
if (lastPageNumber === lastPageParam) {
return undefined
}
return Number(lastPageParam) + 1
},
initialPageParam: Number(page) || 1,
placeholderData: keepPreviousData,
})
}
//더보기 버튼
// 클릭 시 페이지 이동
function AddMore({ fetchNextPage, totalPages }: { fetchNextPage: () => void; totalPages: number }) {
const searchParams = useSearchParams()
const pathname = usePathname()
const params = new URLSearchParams(searchParams.toString())
const pageNo = Number(searchParams.get('page') || 1)
params.set('page', (pageNo + 1).toString())
if (totalPages === pageNo) return null
return (
<div className={cn('wrap')}>
<Link
className={cn('link')}
href={`${pathname}?${params.toString()}`}
onClick={fetchNextPage}
scroll={false}
>
<span className={cn('label')}>더보기</span>
</Link>
</div>
)
}
강의 잘 듣고있습니다. 감사합니다!
참고로 백엔드는 문제가 없습니다.
답변 2
0
initialPageParam: 1
이렇게 고정으로 설정해보시겠어요?
page가 query key에 안들어가있어서 문제 없지 않을까 했는데
gemini에 물어보니 initialPageParam
또한 변경되면 새로운 쿼리로 인식하고 이전 값을 초기화 한다는 답변을 주네요.
만약 해당 이슈가 아니더라도, initialPageParam
은 1로 고정적으로 사용하는게 더 의도와 가까워 보입니다.
0
react-query에는 데이터가 저장되어있는 유효시간이 있는데 그게 초과된 건 아닌가싶습니다. 한번 staleTime과 gcTime을 짧게 줘서 그 시간에 데이터가 사라지는 게 재현되는지 확인해보시고, 맞다면 두 시간을 길게 또는 무한으로 줘보세요.