useSWRInfinite 적용하기(23.11.10)

#현업 #SWR

참고

SWR 공식문서 : https://swr.vercel.app/ko/docs/pagination#useswrinfinite

SWR 심층탐구 : https://velog.io/@code-bebop/SWR-%EC%8B%AC%EC%B8%B5%ED%83%90%EA%B5%AC-useSWRInfinite

function useInfinityDiscoverTagPost(tagId: number) {
  const { data, setSize, isValidating } = useSWRInfinite<
    Response,
    ApiError
  >((pageIndex, prevData) => {
    // pageIndex는 0 부터 시작한다.
    const query = getQueryString({ tagId, size: 20, page: pageIndex + 1 });

    // 이전 데이터들을 load 했고 다음 페이지가 없을 경우 null을 리턴한다.
    if (prevData && !prevData.hasNext) {
      return null;
    }

    // 첫 페이지일 때(prevData가 null) 다음 페이지가 있을 때 key를 리턴한다.
    return `/api/v1/discover/tag/posts?${query}`;
  });

  return {
    // tagPosts: data가 [{ paging, contents }, { paging, contents }, ...] 형식이기 때문에 
    // flatMap 으로 컴포넌트에서 사용할 데이터로 가공한다.
    tagPosts: data?.flatMap(({ contents }) => contents) || [],
    loading: isValidating,
    // setSize는 pageIndex를 업데이트 한다.
    setSize,
  };
}

Last updated