์ง๋ 1์ฐจ ํ๋ก์ ํธ(๋ฅํฐ ๋ชจ์ง)์์ ์๊ฐ์ ์ ์ฝ(๊ทธ๋ฆฌ๊ณ ๋ฅ๋ ฅ์ ์ ์ฝ)์ผ๋ก ๊ตฌํํ์ง ๋ชปํ๋ ํ์ด์ง๋ค์ด์ ๊ธฐ๋ฅ์ ์ด๋ฒ์๋ ๊ผญ ๊ตฌํํ๋ฆฌ๋ผ ์๊ฐํ๋ค. ๊ทธ๋ฐ๋ฐ ์์๋๋ก ํ์ด์ง๋ค์ด์ ๊ตฌํ์ ์ฝ์ง ์์๋ค...๐
์ผ๋จ ๋ฐฐ์ด๋ก ๋ฐ์ ํ์ด์ง์ ์ฟผ๋ฆฌ์คํธ๋ง์ผ๋ก fetch๋ฅผ ํ๋ ๊ฒ๊น์ง๋ ๊ตฌํํด์ค ์ํ์๋ค. ๊ทธ๋ฐ๋ฐ ๋ฐ์ดํฐ๊ฐ ๋์ด๋๋ฉด์ 99ํ์ด์ง๊น์ง ํ์ด์ง๊ฐ ๋์ด๋๊ฒ ๋์๊ณ ... ์นํ์ด์ง ํ๋จ ๋ถ๋ถ์ 99๊ฐ์ ๋ฌํ๋ ํ์ด์ง๋ฒํผ์ด ๋์ด์ ธ์๋ ์ง๊ทํ ํํ๋ฅผ ๋ณด์๋ค.
์ผ๋จ 99๊ฐ๊น์ง ํผ์ณ์ง ๋ฐฐ์ด์ 10๊ฐ๋ก ์์๊ฒ ์๋ผ์ ๋ณด์ฌ์ค์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค๊ธดํ์ง๋ง, ๊ทธ ๋ค์์ ๋ญ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ง๋งํ๋ค. ๊ฒฐ๊ตญ ๋ฉํ ๋๊ป ๋์์ ์ฒญํด ํด๊ฒฐ์ ์ค๋ง๋ฆฌ๋ฅผ ์ป์ ์ ์์๋ค. ์ค๋์ ๊ทธ ํด๊ฒฐ๊ณผ์ ์ ๊ณต์ ํ๊ณ ์ ํ๋ค.
(ํน์ ์๋์ ์ฝ๋๊ฐ ์ ์ดํด๊ฐ ์๊ฐ๋ค๋ฉด ๊นํ์ ์ฐธ์กฐํด์ฃผ์๊ธธ..)
โป์ฃผ์: ํด๋น ์ฝ๋๋ ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์ ์ ์ด ์๋ ๋ ๊ฒ์ ์ฝ๋๋ก ํน์ ๋ ์ข์ ์ฝ๋๊ฐ ๋ ์ ์๋ ํ์ด ์๋ค๋ฉด ๊ผญ ์๋ ค์ฃผ์ธ์!
๋จผ์ state๊ฐ์ผ๋ก totalPage๋ฅผ ๋น ๋ฐฐ์ด๋ก ์ค์ ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ makePageArray๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด for๋ฌธ๊ณผ push๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ํ์ํ ๋ชจ๋ ํ์ด์ง๊ฐ ํด๋น ๋ฐฐ์ด์์ ๋ค์ด์ค๋๋ก ํด์ค๋ค.
const makePageArray = pages => {
let pageArray = [];
for (let i = 1; i <= pages; i++) {
pageArray.push(i);
}
setTotalPage(pageArray);
};
์ ์ฒด ํ์ด์ง ๋ฐฐ์ด์ด ์ค๋น๋๋ค๋ฉด ์ํ๋ ์ ๋งํผ slice๋ก ์๋ผ ์๋ก์ด ๋ฐฐ์ด์ ์ค๋นํด๋๋ค.
let pageArr = [];
const pagination = () => {
for (let i = 0; i < totalPage.length; i += 10) {
pageArr.push(totalPage.slice(i, i + 10));
}
return pageArr;
};
์์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
[
[ 1, 2, 3,...,10 ],
[ 11, 12, 13,..., 20 ],
[ 21 ]
]
๊ทธ๋ฌ๋ ์ ์ฝ๋๋ง์ผ๋ก๋ ํ์ด์ง๋ค์ด์ ์ ์จ์ ํ๊ฒ ์คํํ ์ ์๋ค. ๋ฐ๋ผ์ state๋ก ํ์ํ ์ ๋ณด(์ด์ ํ์ด์ง ๋ฐฐ์ด, ๋ค์ ํ์ด์ง ๋ฐฐ์ด, ํ์ฌ ํ์ด์ง ๋ฐฐ์ด)๋ฅผ ๋ง๋ จํด๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ฒด ํ์ด์ง๊ฐ 0๋ณด๋ค ํฌ๋ฉด 1๋ฒ์ ์ฝ๋์ ์๋์ ์ฝ๋๋ฅผ ํฉ์น makePageInfo๋ฅผ ์คํ์์ผ์ค๋ค.
const currentGroup =
pagination(pageArr)[Math.floor((currentPage - 1) / 10)];
let pageInfo = {
arr: currentGroup.map(el => el),
perv: prevPage ? prevPage : null,
next: prevPage + 11 <= totalPage.length ? prevPage + 11 : null,
};
ํ์ด์ง ๋ฐฐ์ด์ ์ ํํ๊ธฐ ์ํ ํจ์๋ฅผ ์๋์ ๊ฐ์ด ๋ง๋ค์ด์ค๋ค.
const pageClick = e => {
setCurrentPage(+e.target.id);
};
const changePage = e => {
e.target.id === 'prev'
? setCurrentPage(makePageInfo()?.perv)
: setCurrentPage(makePageInfo()?.next);
};
์์ ๋ชจ๋ ํจ์๋ฅผ ์คํ์ํฌ ํ์ด์ง๋ค์ด์ ์ปดํฌ๋ํธ๋ฅผ ์๋์ ๊ฐ์ด ๋ฃ์ด์ค๋ค.
{totalPage.length && (
<Pagination
pages={makePageInfo()?.arr}
pageClick={pageClick}
totalPage={totalPage}
currentPage={currentPage}
changePage={changePage}
/>
)}
ํ์ด์ง๋ค์ด์ ์ปดํฌ๋ํธ๋ ์๋์ ๊ฐ์ด ์๊ฒผ๋ค!
export default function Pagination({
pages,
pageClick,
currentPage,
changePage,
}) {
return (
<PageWrapper>
<ChangeBtn onClick={changePage} id="prev">
<i className="fas fa-arrow-left" />
</ChangeBtn>
<PageListBox>
{pages.map(page => {
return (
<PageBtn
isSelectedPage={currentPage === page}
id={page}
key={page}
onClick={pageClick}
>
{page}
</PageBtn>
);
})}
</PageListBox>
<ChangeBtn onClick={changePage} name="next">
<i className="fas fa-arrow-right" />
</ChangeBtn>
</PageWrapper>
);
}
๋ง์ง๋ง์ผ๋ก makePageArray ํจ์๋ฅผ ์ด์ฉํด์ fetchํ๋ฉด ๋์ด๋ค!
useEffect(() => {
const offset = currentPage - 1;
const requestOptions = {
method: 'GET',
headers: {
Authorization: localStorage.getItem('accessToken'),
},
};
if (currentStatus > 0) {
fetch(
`${HISTORY_API}?search=${search}&status=${currentStatus}&offset=${
offset * LIMIT
}&limit=${LIMIT}`,
requestOptions
)
.then(res => res.json())
.then(res => {
setInvestLog(res);
makePageArray(Math.ceil(res.count[currentStatus] / LIMIT));
});
} else {
fetch(
`${HISTORY_API}?search=${search}&offset=${
offset * LIMIT
}&limit=${LIMIT}`,
requestOptions
)
.then(res => res.json())
.then(res => {
setInvestLog(res);
makePageArray(Math.ceil(res.count.all / LIMIT));
});
}
}, [currentPage, currentStatus, search]);
๋ฐฑ์์ ์ค ์ฟผ๋ฆฌ์คํธ๋ง์ ๊ฐ์ง๊ณ ์ด๋ ๊ฒ ๋ง๋ค์๋ค. currentStatus๋ ์ต์ ์ ํ ๊ฐ์ด๋ผ ๋ฌด์ํด๋ ๋๋ค.
๊ทธ๋ฐ๋ฐ ์๊ณ ๋ณด๋ ์๋์ ๊ฐ์ด ์ธ ์ ์๋ค๊ณ ... ์์ง ์ดํด๊ฐ ์๊ฐ์ง๋ง ๋์ค์ ๋ฆฌํฉํ ๋ง ํ ๋ ์ฌ์ฉํด๋ณด๊ณ ์ถ๋ค!
const opt = {
search,
...(currentStatus > 0 && { status: currentStatus }),
};