Inflearn brand logo image

인프런 커뮤니티 질문&답변

변재정님의 프로필 이미지
변재정

작성한 질문수

Next + React Query로 SNS 서비스 만들기

인피니트 스크롤링

리액트 쿼리 useinfinitequery 무한스크롤 구현 시 페이지가 이동할 경우 데이터가 보존되게 할 수 있나요??

작성

·

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을 짧게 줘서 그 시간에 데이터가 사라지는 게 재현되는지 확인해보시고, 맞다면 두 시간을 길게 또는 무한으로 줘보세요.

변재정님의 프로필 이미지
변재정

작성한 질문수

질문하기