ํ์ด์ง๋ค์ด์
์ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๋ค์ ํ์ด์ง๋ก ๋์ด๊ฐ๋ ๊ฒ์ ๋ปํ๋ค. ํฌ๊ฒ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์๊ณผ, ๋ฌดํ์คํฌ๋กค ๋ฐฉ์์ด ์๋ค.
๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์์ ํ์ด์ง ๋ฒํธ๋ฅผ ํด๋ฆญํด์ ์ด๋ํ๋ ๋ฐฉ์์ด๋ค. ๊ฒ์ํ ํํ์ ํ์ด์ง์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐฉ์์ด๋ค.
๋ฌดํ์คํฌ๋กค ๋ฐฉ์์ ์ธ์คํ๊ทธ๋จ, ํ์ด์ค๋ถ ๋ฑ์์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. ๊ฒ์๊ธ ์๋์ชฝ์ผ๋ก ์คํฌ๋กค์ ๋ด๋ฆฌ๋ฉด ๊ณ์ํด์ ์๋ก์ด ๊ฒ์๊ธ์ด ๋์จ๋ค.
์ค๋์ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์์ ์ค์ตํด๋ณด์๋ค.
// pagination ๊ตฌํ ์ํด page๋ฅผ ์ธ์๋ก ๋ฐ์์ด!
const FETCH_BOARDS = gql`
query fetchBoards($page: Int) {
fetchBoards(page: $page) {
_id
writer
title
contents
}
}
`;
// ๊ฒ์๊ธ ์ ์ฒด ๊ฐฏ์
const FETCH_BOARDS_COUNT = gql`
query {
fetchBoardsCount
}
`;
export default function StaticRoutingPage(): JSX.Element {
const [startPage, setStartPage] = useState(1);
const { data, refetch } = useQuery(FETCH_BOARDS);
// data ์ค๋ณต๋๋ฏ๋ก ์ด๋ฆ ๋ฐ๊ฟ์ฃผ๊ธฐ
const { data: dataBoardCount } = useQuery(FETCH_BOARDS_COUNT);
const lastPage = Math.ceil((dataBoardCount?.fetchBoardsCount ?? 10) / 10);
const onClickPage = (event): void => {
void refetch({
page: Number(event.currentTarget.id),
// id๋ ๋ฌธ์์ด๋ก ๋ฐ์์ค๊ธฐ ๋๋ฌธ์ ์ซ์๋ก ๋ณ๊ฒฝํด์ค์ผ ํจ.
});
};
const onClickPrevPage = (): void => {
if (startPage === 1) return;
setStartPage(startPage - 10);
void refetch({ page: startPage - 10 });
};
const onClickNextPage = (): void => {
if (startPage + 10 <= lastPage) {
// ๋ง์ง๋ง ํ์ด์ง = (๊ฒ์๊ธ ๊ฐฏ์ / 10) ํ ๊ฒ์ ์ฌ๋ฆผ
setStartPage(startPage + 10);
void refetch({ page: startPage + 10 });
// 11ํ์ด์ง๋ก ๋์ด๊ฐ์ ๋ 11ํ์ด์ง๋ถํฐ ์ญ ๊ทธ๋ ค์ฃผ๋๋ก ํจ.
}
};
return (
<div>
{data?.fetchBoards.map((el) => (
<div key={el._id}>
<span style={{ margin: "10px" }}>{el.title}</span>
<span style={{ margin: "10px" }}>{el.writer}</span>
</div>
))}
<span onClick={onClickPrevPage}>์ด์ ํ์ด์ง</span>
{new Array(10).fill("์ฒ ์").map(
(_, index) =>
// ์ธ๋๋ฐ(_)๋ ์์๊ฐ
index + startPage <= lastPage && (
<span
key={index + startPage}
id={String(index + startPage)}
onClick={onClickPage}
>
{index + startPage}
</span>
)
)}
<span onClick={onClickNextPage}>๋ค์ํ์ด์ง</span>
</div>
);
}