๐ง๐ป๐ป ๊ทธ๋ฐ ์์ฌ์ด ๋ค ๋๊ฐ ์๋ค.
๋ํ๊ต ์กธ์ ํ๊ธฐ, ํ์ฅ ๊ฐ์ ์บก์คํค ๋์์ธ ์์ (์ผ๋ช ์กธ์ ์ํ)์ ๋ฃ๊ณ ์๋ค.
ํ์ฅ์ ๋งก์์ ์ฐ๋ฆฌ ๋ํ์ ์ทจ์ ์ญ๋ ๊ฐํ ํ๋ก๊ทธ๋จ ์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ญํน ์ปค๋ฎค๋ํฐ ์ฌ์ดํธ๋ฅผ ๊ฐ๋ฐํ๊ณ ์๋๋ฐ, ์ฌ์ฉ์๋ค์ ๋ญํน์ ๋ณด์ฌ์ค ๋ ํ ํ์ด์ง์ 30๊ฐ์ ๋ฐ์ดํฐ๋ง ๋ณด์ฌ์ฃผ๊ณ ์ถ์๋ค. ๋ชปํด๋ ์ ์ฒด ์ฌํ์ ์๊ฐ 1,000๋ช ์ ์กฑํ ๋์ ๊ฒ์ด๋ฏ๋ก ํ ํ์ด์ง๋ง์ผ๋ก ๋ญํน์ ๋ณด์ฌ์ฃผ๊ธฐ์๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋๊น.
๊ทธ๋์ ํ์ด์ง๋ค์ด์ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋๋ฐ, ๋ฐฑ์๋๋ฅผ ๊ฐ๋ฐํ๋ ํ์์๊ฒ ๋ถํํ๊ธฐ์๋ ์ด๋ฏธ ๊ทธ๊ฐ ๋ง๋ค์ด ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์๋ง์ API๊ฐ ์ค์ ์ ์์๊ธฐ์ ํ์ฅ์ผ๋ก์ ์ด ์ ๋ ์ฒ๋ฆฌ๋ ํ๋ก ํธ์์ ํ๊ฒ ๋ค ์์ ์๊ฒ ๋ง์ ํ๊ณ ๋ ํ์ด์ง๋ค์ด์ ์ ๋ํ ์๋ฃ๋ฅผ ์ด๊ฒ์ ๊ฒ ์ฐพ์๋ณด์๋ค.
๐ก ํ์ด์ง๋ค์ด์ (Pagination)์ด๋?
๋ค์์ ์ปจํ ์ธ ๋ฅผ ์ฌ๋ฌ๊ฐ์ ํ์ด์ง๋ก ๋๋๊ณ ํ์ด์ง ๋ฒํธ, ์ด์ & ๋ค์ ํ์ด์ง ๋ฒํผ์ผ๋ก ํ์ด์ง๋ฅผ ์ค๊ฐ ์ ์๊ฒ ํ๋ ๊ฒ.
๊ทธ๋ฆฌ๊ณ ๋น์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋นผ๋ฉด ์์ฒด์ธ JavaScript ๋ต๊ฒ ํ์ด์ง๋ค์ด์ ์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ํ ์กด์ฌํ๋ค.
ํ์ง๋ง, ์น ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ๋๋ ค๋ฉด ์ด ์ ๋๋ ๊ตฌํํด๋ด์ผ ํ์ง ์์๊น... ํ๋ ๋ง์์ ์ง์ ๊ตฌํํด๋ณด๊ธฐ๋ก ํ์๋ค.
๐ง ํ์ด์ง๋ค์ด์ ์ ์ํ ๊ธฐ๋ณธ ์ง์.
ํ์ด์ง๋ค์ด์ ์ ๊ตฌํํ๊ธฐ ์ํด์ ๋ค๋ฐฉ๋ฉด์ผ๋ก ์๋ฃ๋ฅผ ์ ํ๊ณ , ๋ค์๊ณผ ๊ฐ์ ์์๋ค์ด ์์ด์ผ ๊ตฌํํ ์ ์์์ ์๊ฒ ๋์๋ค.
- ํ์ํ ๋ด์ฉ์ ์ ์ฒด ๊ธธ์ด
- ํ์ด์ง๋ง๋ค ํ์ํ ๋ด์ฉ์ ํ๋
- ๋ด์ฉ์ ํ์ํ ํ์ด์ง์ ์ ์ฒด ๊ฐ์
- ๊ฐ ํ์ด์ง ๋ณ ๊ฐ์ฅ ์ฒ์ ํ์๋ ๋ด์ฉ์ ์ธ๋ฑ์ค (์ด๋ฅผ offset์ด๋ผ๊ณ ํ๋ ๊ฒ ๊ฐ๋ค)
ํ์ํ ๋ด์ฉ์ ์ ์ฒด ๊ธธ์ด๋ถํฐ ์ค๋ช ์ ํด๋ณด์๋ฉด ๋์๊ฒ๋ ๋ญํน ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ ๋๊ฒ ๋ค. ์ด์ด์ ๋ด์ฉ์ ํ์ํ ํ์ด์ง์ ์ ์ฒด ๊ฐ์๋ ํ์ํ ๋ด์ฉ์ ์ ์ฒด ๊ธธ์ด๋ฅผ ํ์ด์ง๋ง๋ค ํ์ํ ๋ด์ฉ์ ํ๋๋ก ๋๋์ด ๋ฐ์ฌ๋ฆผ ํ๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด 50๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ ํ์ด์ง ๋น 30๊ฐ์ฉ ํ์ํ๊ณ ์ถ๋ค๋ฉด ๋ง๋ค์ด์ผ ํ ์ ์ฒด ํ์ด์ง์ ๊ฐ์๋ 50 / 30 = 2 (๋ฐ์ฌ๋ฆผ)๊ฐ ๋๋ค.
๊ฐ ํ์ด์ง๋ณ๋ก ๊ฐ์ฅ ์ฒ์ ํ์๋ ๋ด์ฉ์ ์ธ๋ฑ์ค, ์ฆ offset์ ๊ตฌํด๋ณด์. ์์ ์๋ฅผ ๊ทธ๋๋ก ๊ฐ๊ณ ์ค์๋ฉด 50๊ฐ์ ๋ฐ์ดํฐ๋ฅผ 2 ํ์ด์ง์ ๋๋ 30๊ฐ์ฉ ๋ณด์ฌ์ค ๊ฒฝ์ฐ 1 ํ์ด์ง์ 30๊ฐ, 2 ํ์ด์ง์ 20๊ฐ์ฉ ์ถ๋ ฅ์ด ๋ ๊ฒ์ด๊ณ , ๊ฐ offset์ 1 ํ์ด์ง์์๋ ๋ฆฌ์คํธ์์ 0๋ฒ์งธ ์ธ๋ฑ์ค์ ์์๊ฐ ๋ ๊ฒ์ด๊ณ , 2 ํ์ด์ง์์๋ 30๋ฒ์งธ ์์๊ฐ ๋ ๊ฒ์ด๋ค.
offset์ ๊ตฌํ๋ ๊ณต์์ ์๋์ ๊ฐ๋ค.
๐ก (ํ์ฌ ํ์ด์ง ๋ฒํธ - 1) * ํ์ด์ง๋ง๋ค ํ์ํ ๋ด์ฉ์ ํ๋
์์ ์์ฒ๋ผ ํ ํ์ด์ง ๋น 30๊ฐ์ฉ ์ถ๋ ฅํ ๊ฒฝ์ฐ์ 1 ํ์ด์ง offset์ ๊ตฌํ ๋ ๊ณต์์ ์ ์ฉํ๋ฉด (1 - 1) * 30์ด ๋์ด 0์ด ๋๋ค.
2 ํ์ด์ง์ offset์ ๊ตฌํ ๋๋ ์ ๋ค์ด๋ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๐ค ๋์ ์๋ฃจ์
๋์ ๋ชฉํ
ํ ๋ฒ์ 5 ํ์ด์ง๋ฅผ ์ค๊ฐ ์ ์๊ฒ ํ๋ฉฐ, ๋ฐ์ดํฐ์ ์์ด ๋ง์ ๊ทธ ์ด์์ผ๋ก ๋์ด๋ ๊ฒฝ์ฐ ์ด์ , ๋ค์ ํ์ด์ง๋ก ๋์ด๊ฐ ์ ์๋ ๊ธฐ๋ฅ ๊ตฌํ.
๋ค์ ํ์ด์ง๋ค์ด์ ์ผ๋ก ๋์ด๊ฐ ๋์๋ 5 ํ์ด์ง ์ดํ์ 6ํ์ด์ง๋ฅผ ๋ฐ๋ก ๋ณด์ฌ์ค ์ ์์ด์ผ ํ๋ค. ์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ํ์ด์ง๋ค์ด์ ์ ํ์ด์ง๋ค์ด์ ์ ๊ตฌํํด์ผ ํ๋ค. (์ค์ฒฉ ํ์ด์ง๋ค์ด์ ใทใท)
ํ์ด์ง๋ค์ด์ ์ ์ํ Pagination ์ปดํฌ๋ํธ
๋ฆฌ์คํธ์ ํ์ด์ง๋ค์ด์ ์ ์ํ Pagination ์ปดํฌ๋ํธ๋ ๋ค์๊ณผ ๊ฐ์ ํญ๋ชฉ์ props๋ก ๋ฐ์๋ค์ธ๋ค.
- listLen : number / ๋ฆฌ์คํธ์ ์ ์ฒด ๊ธธ์ด
- limit : number / ํ ํ์ด์ง์ ํ์ํ ๋ฐ์ดํฐ ๊ฐ์
- curPage : number / ํ์ฌ ๋ฆฌ์คํธ์ ํ์ํ ํ์ด์ง
- setCurPage : any / curPage์ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ ์ํ setState ํจ์
๊ทธ๋ฆฌ๊ณ ์ด ์ปดํฌ๋ํธ ์์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ณ์๋ค์ ์ถ๊ฐ๋ก ์ฌ์ฉํ์๋ค. ๊ฐ ๋ณ์์ ๋ํ ์ค๋ช ์ ์ฃผ์์ผ๋ก ๋ฌ์๋์๋ค.
const paginationLimit: number = 5; //ํ์ด์ง๋ค์ด์
๋น 5๊ฐ์ ํญ๋ชฉ์ผ๋ก ์ ํ 1 ~ 5, 6 ~ 10...
const numPages: number = Math.ceil(listLen / limit); //๋ง๋ค์ด์ผ ํ ํ์ด์ง์ ๊ฐฏ์
const [curPagination, setCurPaginaiton] = useState<number>(1); //ํ์ฌ pagination์ index
const [paginationOffset, setPageinationOffset] = useState<number>(1); //pagination์ ์์ ์ง์ (offset)
const [paginationArray, setPaginationArray] = useState<Array<number>>([]); //pagination์ ์ฌ์ฉํ numPages๋งํผ์ ๋ฐฐ์ด
const numPagination: number = Math.ceil(numPages / paginationLimit); //pagination์ pagination ๊ฐฏ์
์ด ์ค curPagination, paginationOffset, numPagination์ ์ด ํ์ด์ง๋ค์ด์ ์ปดํฌ๋ํธ ๋ด์์์ ํ์ด์ง๋ค์ด์ ์ ์ํด ์ฌ์ฉํ ๊ฒ์ด๋ค.
1 ~ 5 ํ์ด์ง๋ฅผ ํ์ธ ํ ๋ค์ 6 ~ 10 ํ์ด์ง๋ฅผ ํ์ธํ๊ธฐ ์ํด ๋ค์์ผ๋ก ๋์ด๊ฐ ๊ฒฝ์ฐ 6 ํ์ด์ง๋ถํฐ ๋ฆฌ์คํธ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ํ์ํ๋ค.
{paginationArray
.slice(paginationOffset, paginationOffset + paginationLimit)
.map((item, index) => (
<Button key={index}>
<p
id={(item + 1).toString()}
className={`page ${curPage === item + 1 ? "active" : ""}`}
onClick={onClickHandler}
>
{item + 1}
</p>
</Button>
))}
์ ์ฝ๋๋ ์ฃผ์ ๋ก์ง ์ฝ๋์ธ๋ฐ, Styled-Components๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด ์ ์ ๊ฐ์ํด์ฃผ์๊ธธ....
paginationArray๋ ์ ์ฒด ํ์ด์ง๋ฅผ ๋์ดํ์ฌ ๋ฐฐ์ด๋ก ๋ง๋ ๊ฒ์ด๋ค. ๊ฐ๋ น ์ ์ฒด ๋ฆฌ์คํธ์ ๊ธธ์ด๊ฐ 300๊ฐ์ฌ์ ์ ์ฒด ํ์ด์ง์ ๊ฐ์๊ฐ 10๊ฐ๊ฐ ํ์ํ๋ค๊ณ ํ์ ๋, paginationArray๋ 0 ~ 9์ ๊ฐ์ด ๋ค์ด์๋ค. ์ด๊ฒ์ paginationOffset๋ถํฐ ์์ํ์ฌ paginationOffset + paginationLimit ๋งํผ slice() ํ์ฌ ํด๋น ๋ถ๋ถ๋ง map()์ ์ด์ฉํด ๋ฆฌ์คํธ ๋ ๋๋ง์ ์งํํ๋ ๊ฒ์ด๋ค.
๊ฐ๋ น 1 ๋ฒ์งธ ํ์ด์ง๋ค์ด์ ์ ๋ณด์ฌ์ค ๋์๋ 0 ~ 4 ๊น์ง๋ง ์๋ผ ์ด๋ฅผ ๋ ๋๋ง ํ๋ ๊ฒ์ด๋ค.
{curPagination >= 2 && (
<PaginationButton id={"decrease"} onClick={onClickHandlerPagination}>
<FontAwesomeIcon icon={faAngleLeft} size="2x" color="#1e98fd" />
</PaginationButton>
)}
{curPagination != numPagination && (
<PaginationButton id={"increase"} onClick={onClickHandlerPagination}>
<FontAwesomeIcon icon={faAngleRight} size="2x" color="#1e98fd" />
</PaginationButton>
)}
์ด ๋ก์ง์ ์ฒซ ํ์ด์ง๋ค์ด์ ์ ์ ์ธํ ํ์ด์ง๋ค์ด์ ์์ ์ด์ ๋ฒํผ์ ๋ ๋๋งํ๊ณ , ๋ง์ง๋ง ํ์ด์ง๋ฅผ ์ ์ธํ ํ์ด์ง๋ค์ด์ ์์ ๋ค์ ๋ฒํผ์ ๋ ๋๋ง ํ๊ธฐ ์ํ ๋ก์ง์ด๋ค. div์ id๋ฅผ ๊ฐ๊ฐ "decrease"์ "increase"๋ก ์ค์ ํ์ฌ onClickHandlerPagination ์ด๋ฒคํธ ํธ๋ค๋ง์ ํตํด ํ์ฌ์ ํ์ด์ง๋ค์ด์ ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ค.
์๋๋ Pagination ์ปดํฌ๋ํธ์ ์ ์ฒด ์ฝ๋์ด๋ค.
const onClickHandler = (e: React.MouseEvent) => {
console.log((e.target as HTMLParagraphElement).id);
setCurPage(Number((e.target as HTMLParagraphElement).id));
};
const onClickHandlerPagination = (e: React.MouseEvent) => {
//ํ์ด์ง๋ค์ด์
์ ์ด์ , ๋ค์์ ์ํ onClick Handler
const value: string = (e.target as any).id;
console.log((e.target as any).id);
if (value === "decrease") {
setCurPaginaiton(curPagination - 1);
} else if (value === "increase") {
setCurPaginaiton(curPagination + 1);
}
};
useEffect(() => {
//ํ์ฌ ํ์ด์ง๋ค์ด์
์ด ๋ณ๊ฒฝ๋๋ฉด ํ์ด์ง๋ค์ด์
์คํ์
๊ณผ ํ์ฌ ํ์ด์ง๋ฅผ ํด๋น ํ์ด์ง๋ค์ด์
์ ์ฒซ ๋ฒ์งธ ํ์ด์ง๋ก ๊ฐฑ์
setPageinationOffset((curPagination - 1) * paginationLimit);
setCurPage(curPagination * paginationLimit - 4);
}, [curPagination]);
useEffect(() => {
//์ ์ฒด ํ์ด์ง ๊ฐ์๋ฅผ ํตํด 0 ~ ์ ์ฒด ํ์ด์ง ๊ฐ์๋ฅผ ๋ด์ ๋ฐฐ์ด์ ์์ฑํ๋ค.
let arr: Array<number> = Array(numPages)
.fill()
.map((item, index) => {
return index;
});
setPaginationArray(arr);
}, [numPages]);
return (
<PaginationContainer>
{curPagination >= 2 && (
<PaginationButton id={"decrease"} onClick={onClickHandlerPagination}>
<FontAwesomeIcon icon={faAngleLeft} size="2x" color="#1e98fd" />
</PaginationButton>
)}
{paginationArray
.slice(paginationOffset, paginationOffset + paginationLimit)
.map((item, index) => (
<Button key={index}>
<p
id={(item + 1).toString()}
className={`page ${curPage === item + 1 ? "active" : ""}`}
onClick={onClickHandler}
>
{item + 1}
</p>
</Button>
))}
{curPagination != numPagination && (
<PaginationButton id={"increase"} onClick={onClickHandlerPagination}>
<FontAwesomeIcon icon={faAngleRight} size="2x" color="#1e98fd" />
</PaginationButton>
)}
</PaginationContainer>
);
};
๋ฐ์ดํฐ๋ฅผ ํ์ํ ListTable์์์ ํ์ด์ง๋ค์ด์ ์๋ฃจ์
๋ญํน ๋ฆฌ์คํธ๋ ์ฌ๋ฌ ๊ณณ์์ ์ฐ์ด๋ฏ๋ก ํ ์ด๋ธ์ ๋ณ๋์ ์ปดํฌ๋ํธ, ListTable๋ก ์ถ์ถํ์ฌ ์ฌ์ฌ์ฉ์ ํธ์๋ฅผ ๋๋ชจํ๋ค.
์ด ListTable ์ปดํฌ๋ํธ์ props๋ ๋ค์๊ณผ ๊ฐ๋ค.
- head : Array<string> / ํ ์ด๋ธ ํค๋๋ก ์ฐ์ผ ๋ฌธ์์ด ๋ฐฐ์ด
- list : React.ReactNode[][] / tr์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ฆฌ์กํธ ๋ ธ๋ ๋ฐฐ์ด
- offset : number / ๊ฐ ํ์ด์ง์ ์์์ ์ ์๋ ค์ฃผ๊ธฐ ์ํ offset
- limit : number / ๊ฐ ํ์ด์ง๊ฐ ๋ณด์ฌ์ค ๋ฆฌ์คํธ์ ์ต๋ ๊ธธ์ด
{data.slice(offset, offset + limit).map((row, index) => (
<tr key={index}>
{row.map((col, index) => (
<td key={index}>{col}</td>
))}
์ ์ฒด ๋ฆฌ์คํธ๋ก ๋ค์ด์จ data๋ฅผ offset์์๋ถํฐ ์์ํ์ฌ offset + limit ๊น์ง ์๋ผ map()์ ํตํด ๋ฆฌ์คํธ ๋ ๋๋ง์ ์งํํ๋ค. ๋ง์ฝ 1 ํ์ด์ง์ฌ์ offset์ด 0์ด๋ผ๋ฉด 0 ~ 30 ๊น์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์คํธ์ ์ถ๋ ฅ์ํค๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํตํด ํ ํ์ด์ง์ 30๊ฐ์ฉ ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ค ์ ์๋ค.
์๋๋ ListTable ์ปดํฌ๋ํธ์ ์ ์ฒด ์ฝ๋์ด๋ค.
const ListTable = ({ head, list, offset, limit }: Props) => {
const [isMounted, setMounted] = useState(false);
const [data, setData] = useState<React.ReactNode[][]>([]);
useEffect(() => {
setMounted(true);
}, []); // Prevent hydration error
useEffect(() => {
setData(list);
}, [list]);
return (
isMounted && (
<TableStyle>
<TheadStyle>
{head.map((thData, index) => (
<th key={index}>{thData}</th>
))}
</TheadStyle>
<TbodyStyle>
{data.slice(offset, offset + limit).map((row, index) => (
<tr key={index}>
{row.map((col, index) => (
<td key={index}>{col}</td>
))}
</tr>
))}
</TbodyStyle>
</TableStyle>
)
);
};
์ ์ฒด ๋ญํน์ ๋ณด์ฌ์ฃผ๋ RankingAll ์ปดํฌ๋ํธ
RankingAll ์ปดํฌ๋ํธ๋ ์์ Pagination ์ปดํฌ๋ํธ์ Pagination์ ํฉ์ฑํด์ ์ฌ์ฉ์๋ณ ์ ์ฒด ๋ญํน์ ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ๋ค.
์ด ์ปดํฌ๋ํธ์์๋ axios๋ฅผ ํ์ฉํ ๋น๋๊ธฐ ํต์ ์ ํตํด API์์ ์ ์ฒด ์ฌ์ฉ์ ๋ญํน์ ๋ฐ์์จ ๋ค, ListTable์ ๋๊ฒจ์ฃผ๊ธฐ ์ํด React.Node[][] ํ์ ์ผ๋ก ๊ฐ๊ณตํ๋ค. ๊ทธ๋ฆฌ๊ณ curPage์ offset์ ์ง์ ํ์ฌ ListTable๊ณผ Pagination์ผ๋ก ๊ฐ๊ฐ props๋ก ๋๊ฒจ์ฃผ๊ฒ ๋๋ค.
๋ด๊ฐ ์๊ฐํ๊ธฐ์ ํ์ฌ ํ์ด์ง์ ํ์ฌ ํ์ด์ง๋ฅผ ๊ฐฑ์ ํ๋ ํจ์๋ฅผ props๋ก ๋ด๋ ค์ฃผ๋ ๊ฒ๋ณด๋ค ์ข์ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ ๊ฐ์๋ฐ ์ง๊ธ์ ๋ด ๋จธ๋ฆฌ๋ก์จ๋ ์ฌ๊ธฐ๊ฐ ํ๊ณ์ธ ๊ฒ ๊ฐ๋ค.
์ค๊ณ๋ก๋ ๊ฐ ํญ๋ชฉ๋ณ ๋ญํน ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ API๋ฅผ ํธ์ถํ์ฌ ๋ฐ์์ค๊ณ ListTable์ ๋๊ธฐ๊ณ ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฐ์์ผ๋ก ๊ตฌํํ๊ฒ ๋์๋ค. ์ธ์ ๋ ๊ทธ๋ ๋ฏ ์ด๊ฒ๋ณด๋ค ์ข์ ๋ฐฉ๋ฒ์ ๋ ์๊ฒ ์ง๋ง...
RankingAll ์ปดํฌ๋ํธ์ ์ ์ฒด ์ฝ๋
const RankingAll = () => {
const limit: number = 30; //๋ญํน ๋ชฉ๋ก ์ ํ
const [curPage, setCurPage] = useState<number>(1); //ํ์ฌ ํ์ด์ง
const [offset, setOffset] = useState<number>(0);
const [allListLen, setAllListLen] = useState<number>(0);
const [rankingAll, setRankingAll] = useState<React.ReactNode[][]>([]);
const refactorData = (list: userData[]) => {
let tmpArray: React.ReactNode[][] = [];
//๋ฆฌํฉํ ๋ง ๋ก์ง ์๋ต
setRankingAll(tmpArray);
};
useEffect(() => {
axios
.get("http://Host:port/allRanking")
.then(function (response) {
// ์ฑ๊ณต ํธ๋ค๋ง
setAllListLen(response.data.length);
refactorData(response.data);
console.log("Loaded All Ranking Data");
})
.catch(function (error) {
// ์๋ฌ ํธ๋ค๋ง
console.log(error);
})
.finally(function () {
// ํญ์ ์คํ๋๋ ์์ญ
});
}, []);
useEffect(()=> {
setOffset((curPage - 1) * limit);
//์คํ์
(ํ์ด์ง ์์์ ) ์ ์ฉ.
},[curPage]);
return (
<ListAllContainer>
<ListTable head={tableHead} list={rankingAll} offset={offset} limit={limit} />
<Pagination listLen={allListLen} limit={limit} curPage={curPage} setCurPage={setCurPage}/>
</ListAllContainer>
);
};
๐ ๋ง์น๋ฉฐ.
์ ์ฒด ๋ฆฌ์คํธ๊ฐ 50๊ฐ ๋ฐ์ ๋์ง ์์ 2๊ฐ์ ํ์ด์ง๋ง ์กด์ฌํ๋ ํ์ด์ง๋ค์ด์ .
props๋ก ์ฃผ์ด์ง๋ listLen์ ์์๋ก 1000์ผ๋ก ๋๋ ธ์ ๋์ ํ์ด์ง๋ค์ด์ .
๊ฒฐ๋ก ์ ์ผ๋ก๋ ๋ด๊ฐ ์ํ๋ ๊ฒ์ ๋ชจ๋ ๊ตฌํํด๋ด๊ธด ํ๋ค.
์ฝ๋๊ฐ ์กฐ๊ธ์ ์ง์ ๋ถํ๊ณ ์ด๊ฒ๋ณด๋ค ๋ ๋์ ๋ฐฉ๋ฒ์ด ์์ ๊ฑฐ๋ผ ๋ถ๋ช ํ ์๊ฐ์ ํ์ง๋ง, ๊ทธ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํด ์จ ๋ด๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ์ค์ค๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ๊ณ ๋ฏผํ ๊ณผ์ ์ด ๊ด์๋ฆฌ ์๋์ค๋ฝ๋ค.
์ฝ์กธ์ ์ํ์ ํ๊ธฐ ๋ด์ ๋๋ด์ผ ํ๋ ๋งํผ ์๋๋ ์ค์ํ๊ธฐ์ ์ด๋ฒ์ ํ์ด์ง๋ค์ด์ ๊ตฌํ์ ์ฌ๊ธฐ์ ๋๋ง์น ๊น ํ๋ค. ์กธ์์ด ๋๋๋ฉด ๊ทธ๋๋ผ๋ ๋ ์ข์ ๋ฐฉํฅ์ผ๋ก ๋ฆฌํฉํ ๋ง์ ํด๋๊ฐ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
๋ด๊ฐ ์๋ฃ๋ฅผ ํ์ฐฝ ์ฐพ์๋ณผ ๋ ๋ณธ ๋ค๋ฅธ ์ค๋ ฅ์๋ถ๋ค์ ๊ธ์ ์ด๊ฒ๋ณด๋ค ๋ง์ด ๊น๋ํ๋ ๊ฒ ๊ฐ์๋ฐ ์ด์งธ์ ๋ด๊ฐ ์ด ๊ธ์ ๋ญ๊ฐ ๋น๋น ๋์๊ฐ๋ ๊ธฐ๋ถ์ด๋ค. ๊ธ๋ ์์ฃผ ์จ๋ณด๋ฉด์ ๊ฐ์ ์ตํ์ผ๊ฒ ๋ค.
'Web Programming > React.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React.js] TypeScript์์์ setState ๋ฑ๋ฑ์ ๋ํด ์์๋ณด์ (1) | 2023.10.20 |
---|---|
[React.js] create-react-app์ผ๋ก ๋ฆฌ์กํธ ์ฑ ์์ํ๊ธฐ (0) | 2021.12.09 |