import classNames from "classnames";
import { Link } from "react-router-dom";
import { useLocation } from "react-router-dom";
export default function Pagination({
page,
totalPages,
paginationSize,
onChange,
}) {
let pageNumber = page;
let startPage =
Math.floor((pageNumber - 1) / paginationSize) * paginationSize + 1;
let endPage = startPage + paginationSize - 1;
const location = useLocation();
const searchParams = new URLSearchParams(location.search);
return (
<>
<div className={classNames("left-arrow")}>
{startPage > 1 && (
<Link
to={`${location.pathname}?${searchParams.toString()}`}
state={{ page: startPage - 1 }}
>
<
</Link>
)}
</div>
<div className={classNames("page-number")}>
{Array.from(
{ length: Math.min(totalPages, endPage) - startPage + 1 },
(_, index) => startPage + index
).map((pageNumber, index) => {
return (
<Link
to={`?page=${pageNumber}`}
state={{ page: pageNumber }}
className={classNames("page-item")}
key={index}
onClick={() => onChange(pageNumber)}
>
{pageNumber}
</Link>
);
})}
</div>
<div className={classNames("right-arrow")}>
{endPage < totalPages && (
<Link to={`?page=${endPage + 1}`} state={{ page: endPage + 1 }}>
>
</Link>
)}
</div>
</>
);
}
- 페이지네이션을 적용한 컴포넌트에 다음과 같이 import
import Pagination from "../components/Pagination";
- 페이지네이션 변수를 관리하기 위한 useState 추가
const [page, setPage] = useState(1);
const [totalPages, setTotalPages] = useState(1);
- 페이지네이션 div에 다음과 같은 코드 작성
<div className={classNames("paginate")}>
<Pagination
page={page}
totalPages={totalPages}
paginationSize={5}
onChange={search}
/>
</div>
- 페이지네이션을 적용시킬 함수 선언
const search = (pageNumber = 1) => {
getAccountList({
page: pageNumber - 1,
}).then((response) => {
setPage(response.data.pageInfo.page + 1);
setTotalPages(response.data.pageInfo.totalPages);
});
};
- URL의 location 상태 변경을 감지하여, 페이지 번호를 업데이트
useEffect(() => {
if (location.state && location.state.page) {
setPage(location.state.page);
}
}, [location]);
- 사용자가 페이지 번호를 클릭할 때, 해당 페이지 번호를 location의 state로 설정하고, 컴포넌트가 리렌더링되면서 useEffect 내부의 로직이 실행된다.
<Link
to={`?page=${pageNumber}`}
state={{ page: pageNumber }}
className={classNames("page-item")}
key={index}
onClick={() => onChange(pageNumber)}
>
{pageNumber}
</Link>