TIL #63 | [Next.js] Mui를 사용한 페이지네이션 구현

kibi·2024년 1월 14일
1

TIL (Today I Learned)

목록 보기
63/83

💬 데이터베이스는 supabase, 서버 상태 관리로는 React Query를 사용하고 있는 환경에서 페이지네이션을 구현해보았다.

mui에서 제공하는 페이지네이션이 깔끔해서 사용해서 구현해보도록 했다.
mui pagination

기본적으로 mui 페이지네이션에 사용할 수 있는 프로퍼티

  • page - 현재 페이지 값
  • conunt - 모든 페이지 수
  • shape - 모양 설정
  • onChange - 페이지 선택 시 실행할 함수

구현에 필요한 프로퍼티를 페이지네이션 컴포넌트에 지정해줬다.

<Pagination
  page={page}
  count={Math.ceil(totalLength / 10)}
  shape="rounded"
  onChange={onClickPage}
/>

먼저, 현재 페이지와 페이지에서 보여줄 리스트 수를 useState를 사용하여 지정해주고 페이지를 클릭 시 page에 현재 페이지를 저장해서 사용할 수 있도록 했다.

  const [page, setPage] = useState(1)
  const [pageSize, setPageSize] = useState(5)
  
  const onClickPage = (e: React.ChangeEvent<unknown>, page: number) => {
    setPage(page) // 현재 페이지 저장
  }

useQuery의 range()를 사용하여 페이지네이션을 구현해주기 위해 offset과 limit 값이 필요하기 때문에 page와 pageSize로 각각 들어갈 값을 계산해주었다.

  const queryOption = {
    limit: pageSize + (page - 1) * pageSize,
    offset: (page - 1) * pageSize,
  }

리스트 데이터를 가져오는 함수인 getProjects를 호출할 때 limit가 초기값인 0이 아니라면 range(offset, limit) 가 적용된 값을 가져와서 페이지네이션 할 수 있도록 설정해줬다.

export async function getProjects({
  limit = 0,
  offset = 0,
}: Values) {
  const query = supabaseForClient.from("projects").select("*")

  limit !== 0 && query.range(offset, limit)


  const { data, error } = await query
  
  if (error) console.log("error", error)

  return data
}

이를 useQuery의 queryFn에 지정해주고, 의존성 키 값으로 page 값을 넣어주어 페이지가 변경될 때마다 refetch 될 수 있도록 설정했다.

  const { data } = useQuery({
    queryKey: ["projects", page],
    queryFn: () => getProjects(queryOption),
  })

useQuery를 사용할 때 쿼리가 변수에 의존하는 경우 의존성 키 값을 반드시 지정해주어야 값이 변경될 때마다 refetch 되어 바로 반영되기 때문에 이를 적절하게 설정해주는 것이 아주 중요한 것 같다.
이번에는 css 라이브러리를 사용하여 페이지네이션을 구현해보았는데 다음에 만들 때는 라이브러리를 사용하지 않고 페이지네이션을 완전히 만들어보는 것도 좋을 것 같다.

0개의 댓글