728x90
📄리액트로 페이지네이션 초간단 구현하기
1. 기본 설계
페이지네이션은
- 현재 페이지
- 전체 페이지 수
- 한 페이지에 표시할 개수
가 필요하다!
const [currentPage, setCurrentPage] = useState(1);
const itemsPerPage = 4;
2. 데이터 필터링
const totalPages = Math.ceil(filteredHabits.length / itemsPerPage);
const displayedHabits = filteredHabits.slice(
(currentPage - 1) * itemsPerPage,
currentPage * itemsPerPage,
);
한 페이지 당 4개가 보여야 하기때문에 slice를 해준다!!
ex) currentPage가 1일 때, (1 - 1) * 4 = 0 -> 첫 번째 항목부터 시작
ex) currentPage가 2일 때, (2 - 1) * 4 = 4 -> 5번째 항목부터 시작
3. 페이지네이션 컴포넌트 만들기
import { FiChevronLeft, FiChevronRight } from 'react-icons/fi'
type PaginationProps = {
currentPage: number
totalPages: number
onPageChange: (page: number) => void
}
export default function Pagination({
currentPage,
totalPages,
onPageChange,
}: PaginationProps) {
const handlePageChange = (page: number) => {
if (page < 1 || page > totalPages) return
onPageChange(page)
}
return (
<div className="mt-4 flex justify-center space-x-2">
<button
onClick={() => handlePageChange(currentPage - 1)}
disabled={currentPage === 1}
className="flex size-10 items-center justify-center rounded-full bg-gray-200 p-2 disabled:cursor-not-allowed"
>
<FiChevronLeft />
</button>
{Array.from({ length: totalPages }, (_, index) => (
<button
key={index}
onClick={() => handlePageChange(index + 1)}
className={`flex size-10 items-center justify-center rounded-full ${
currentPage === index + 1 ? 'bg-green-30 text-white' : 'bg-gray-200'
}`}
>
{index + 1}
</button>
))}
<button
onClick={() => handlePageChange(currentPage + 1)}
disabled={currentPage === totalPages}
className="flex size-10 items-center justify-center rounded-full bg-gray-200 p-2 disabled:cursor-not-allowed"
>
<FiChevronRight />
</button>
</div>
)
}
- 이전 버튼: currentPage가 1이면 비활성화
그 외에는 currentPage - 1을 호출하여 한 페이지 뒤로 이동 - 다음 버튼: currentPage가 totalPages와 같으면 비활성화
그 외에는 currentPage + 1을 호출하여 한 페이지 앞으로 이동 - 페이지 번호 버튼: 각 페이지 번호를 클릭하면 해당 페이지로 이동하고, onPageChange 함수를 통해 currentPage를 업데이트한다.
4. 페이지네이션 컴포넌트 사용하기
부모컴포넌트에 페이지네이션 컴포넌트를 넣어주면 끝이돠. (위의 1, 2번도 부모에 넣어줘야함!!)
<Pagination
currentPage={currentPage}
totalPages={totalPages}
onPageChange={setCurrentPage}
/>
'🔥React 뽀개기' 카테고리의 다른 글
path를 따라가는 로딩화면 구현하기 (0) | 2024.08.16 |
---|---|
Toast 공통 컴포넌트 만들기 (feat.react-toastify) (0) | 2024.08.08 |
react-hook-form + yup = 회원가입/로그인(feat.쿠키) (0) | 2024.08.02 |
input 공통 컴포넌트로 만들기 (feat. react-hook-form + yup) (0) | 2024.08.01 |
라이브러리 없이 state로 폼 만들기 (0) | 2024.07.31 |