๊ธฐ๋ฅ ์๊ตฌ์ฌํญ ๋ถ์
ํผ๊ทธ๋ง์์ ๊ฐ์ ธ์๋ค. ์์์ ์ ์ ์๋ ๊ฒ์ ํ์ด์ง๊ฐ ์ต๋ 7๊ฐ๋ง ๋ณด์ฌ์ ธ์ผ ํ๋ค๋ ๊ฒ์ด๊ณ , ์ ํ๋ ํ์ด์ง๋ฅผ ๊ฐ์ด๋ฐ์ ์ค๋๋ก ํด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๊ตฌํ
export default function Pagination({ currentPage, setCurrentPage, allDataCount, perPageDataCount }: Props) {
const pageCount = Math.ceil(allDataCount / perPageDataCount);
const pageNumberList = createPageNumberList(currentPage, pageCount);
return (
<div className={styles.container}>
{pageCount > PAGE_LIMIT && (
<button disabled={currentPage < 2} type="button" onClick={() => setCurrentPage(currentPage - 1)}>
{'<'}
</button>
)}
<ul className={styles.list}>
{pageNumberList.map(
(item) =>
item <= pageCount && (
<li
className={`${styles.listItem} ${currentPage === item ? styles.selected : ''}`}
key={item}
onClick={() => setCurrentPage(item)}
>
{item}
</li>
),
)}
</ul>
{pageCount > PAGE_LIMIT && (
<button disabled={currentPage === pageCount} type="button" onClick={() => setCurrentPage(currentPage + 1)}>
{'>'}
</button>
)}
</div>
);
}
์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ๊ตฌํ์ ํด์ฃผ์๋ค. createPageNumberList ๋ถ๋ถ์ด ์ค์ํ๋ฐ,
const createPageNumberList = (currentPage: number, pageCount: number): number[] => {
let firstCursor = currentPage - Math.floor(PAGE_LIMIT / 2);
let lastCursor = currentPage + Math.floor(PAGE_LIMIT / 2);
if (firstCursor < 1) {
lastCursor += 1 - firstCursor;
firstCursor = 1;
}
if (lastCursor > pageCount) {
firstCursor -= lastCursor - pageCount;
firstCursor = firstCursor < 1 ? 1 : firstCursor;
}
return new Array(lastCursor - firstCursor + 1).fill(0).map((_, i) => i + firstCursor);
};
์์๊ฐ์ด ๋ง๋ค์ด์ฃผ์๋ค. ๋๋ฆ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ ์ฌ์ด ์ฝ๋๋ผ๊ณ ์๊ฐํ๋ค. currentPage๋ฅผ ๊ธฐ์ ์ผ๋ก ์ด๊ฒ์ด 7๊ฐ ์ค์ ๊ฐ์ด๋ฐ ์ค๋ ค๋ฉด ์ค๋ฅธ์ชฝ, ์ผ์ชฝ ๊ฐ๊ฐ 3๊ฐ๊ฐ ์์ด์ผ ํ๋ค. ์๋ค๋ฉด ๊ทธ๋๋ก ๋ฐฐ์ด์ ๋ง๋ค์๋ค. currentPage๊ฐ 3 ์ดํ์ผ ๊ฒฝ์ฐ์๋ ๋ชจ์๋ฅธ ๊ฐ์ ๋งํผ ์ค๋ฅธ์ชฝ์ ์ค๋ ๊ฐ๋ค์ ๋๋ฆฌ๊ณ ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋๊ฐ์ด ํ์๋ค.
+์ถ๊ฐ
const createPageNumberList = (currentPage: number, totalPages: number): number[] => {
let startPage = 1;
if (currentPage > 4) {
startPage = currentPage - 3;
}
let endPage = startPage + PAGE_LIMIT - 1;
if (endPage > totalPages) {
startPage -= endPage - totalPages;
endPage = totalPages;
startPage = startPage < 1 ? 1 : startPage;
}
return new Array(endPage - startPage + 1).fill(0).map((_, i) => i + startPage);
};
๋ณ์๋ช ๊ณผ ๋ก์ง์ ๊ฐ์ ํด๋ณด์๋ค. ์ฝ๋๊ฐ ํจ์ฌ ํ์ ํ๊ธฐ ์ฌ์์ง ๊ฒ ๊ฐ๋ค.
+ ๋ ์ถ๊ฐ
ํ์๋ค์ ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์๋๋ฐ let์ ์ด ๋ถ๋ถ๊ณผ i์ ๊ฐ์ด ์ถ์ฝ์ผ๋ก ์ด ๋ถ๋ถ์ ๊ณ ์ณ๋ณด๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค๋ผ๋ ํผ๋๋ฐฑ์ด์๋ค.
const createPageNumberList = (currentPage: number, totalPages: number): number[] => {
const startPage = Math.max(1, Math.min(currentPage - 3, totalPages - PAGE_LIMIT + 1));
const endPage = Math.min(startPage + PAGE_LIMIT - 1, totalPages);
return new Array(endPage - startPage + 1).fill(0).map((_, index) => index + startPage);
};
ํ.. ์ด๋ ๊ฒ ๊ฐ์ ํด๋ณด์๋ค. ํ์๋ค์ด ์๋์์ผ๋ฉด ์๊ฐํด๋ณด์ง ์์์ ๋ถ๋ถ์ด์๋ค. ์ ์ฝ๋์ ์ฅ์ ์ ๊ฐ๊ฒฐํ๋ค๋ ๊ฒ๊ณผ let์ ์์ด๋ค๋ ๊ฒ์ด๋ค (eslint prefer/const rule์ ๋์ง ์์๋ ๋์๋ค..) ๋ง์ธ..!! ๋ ํ๋ ๋ฐฐ์๊ฐ๋ค..์ข์ ๋๋ฃ์ ์ค์์ฑ์ ๋ค์ ๋๋๋ค
๊ณ ๋ฏผํ๋ ๋ถ๋ถ
์ด๋ ํ์ด์ง๊ฐ select ๋์๋์ง ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ณณ์์ ์์์ผ ํ๋ค. ๋ชจ๋ฅด๋๋ผ๋ ํน์ ํ์ด์ง๋ฅผ ๋๋ ์ ๋ ์คํํ ํจ์๋ฅผ prop์ผ๋ก ๋ด๋ ค์ฃผ๊ฒ ํ๋ฉด ๋ ๊ฒ ๊ฐ์์ง๋ง ํ์ด์ง๋ค์ด์ ์ปดํฌ๋ํธ๋ฅผ ํน์ ๊ธฐ๋ฅ์ ์ ๋ชฉํ๊ธฐ ์ด์ ์๋ ๊ทธ๊ฒ์ ํ์ ํด์ ๋ง๋ค๊ณ ์ถ์ง ์์๋ค. ๊ทธ๋์ ์ผ๋จ ์ธ๋ถ์์ currentPage state๋ฅผ ๋ง๋ค์ด์ Props๋ก ๋ณด๋ด์ฃผ๋ ๋ก์ง์ผ๋ก ๊ตฌํํ๋ค. ๋ ํ์ด์ง๋ค์ด์ ์ปดํฌ๋ํธ ํด๋ฆญ ๋ถ๋ถ์ Link ํ๊ทธ๋ฅผ ๋ฃ์์ง ๋ฑ ๊ณ ๋ฏผ์ ํ์๋ค. ์์ง์ ๋จธ๋ฆฟ์์ ์ ๊ทธ๋ ค์ง์ง ์์ ์ง์ ์ ์ฉ์์ผ ๋ณด๋ฉฐ ๊ฐ์ ํด๋๊ฐ ์์ ์ด๋ค.