ProductsList.jsx
ํ๋ผ๋ฏธํฐ์์ page๊ฐ์ ธ์์ useData์ ํ๋ผ๋ฏธํฐ๋ก ์ถ๊ฐํ๋ค.,
const ProductsList = () => {
//sidebar์์ ์นดํ
๊ณ ๋ฆฌ ์ฟผ๋ฆฌ์คํธ๋ง์ ๋ฐ์์จ๋ค.
const [search, setSearch] = useSearchParams();
const category = search.get("category"); //๋ชจ๋ ์ฟผ๋ฆฌ์คํธ๋ง ์ค ์นดํ
๊ณ ๋ฆฌ
const page = search.get("page");
//useDate(url)์ด ๋ค์ด๊ฐ์ผํจ
//๊ฒฐ๊ณผ(res)๋ categories์, error์ ๋ด๋๋ค.
const { data, error, isLoading } = useData(
"/products",
{
params: {
category, //์นดํ
๊ณ ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ ๋ฌ
page, //ํ์ด์ง ์ถ๊ฐ(ํ์ด์ง๋ค์ด์
์ฌ์ฉ)
},
},
[category, page]
);
//ํ์ด์ง ๋ณ๊ฒฝ(ํ์ด์ง ๊ฐ์ด ๋ค์ด์ค๋ฉด )
const handlePageChange = (page) => {
const currentParams = Object.fromEntries([...search]);
setSearch({ ...currentParams, page: page });
};
์ ์ผ ์๋์ ๋ฒํผ์ ์ถ๊ฐํด์ 2ํ์ด์ง๋ก ๊ฐ๋์ง ํ ์คํธํ๋ค.
<button onClick={() => handlePageChange(2)}>ํ์ด์ง 2</button>
</div>
</section>




์์ ํ์ด์ง ๋ฒํผ์ ํ ์คํธ๋ฅผ ํด๋ณธ๊ฑฐ๊ณ
ํ์ด์ง๋ค์ด์ ์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ค.

Pagination.jsx
import "./Pagination.css";
// ์ ์ฒด์์ดํ
๊ฐ์ ,ํํ์ด์งํ์์์ดํ
์, ํด๋ฆญํจ์, ํ์ฌํ์ด์ง
const Pagination = ({ total, perPage, onClick, currentPage }) => {
let pages = [];
for (let i = 1; i <= Math.ceil(total / perPage); i++) {
pages.push(i); //ํ์ด์ง์๋งํผ ๋ฐฐ์ด์ ์ซ์๋ฅผ ์
๋ ฅํ๋ค.
}
//ํ์ฌ ํ์ด์ง๊ฐ ์์ ๊ฒฝ์ฐ ์ฒซํ์ด์ง 1์ด๋ค.
currentPage = currentPage ? currentPage : 1;
return (
<>
{pages.length > 1 && (
<ul className="pagination">
{pages.map((page) => (
<li key={page}>
<button
className={
parseInt(currentPage) === page
? "pagination_button active"
: "pagination_button"
}
onClick={() => onClick(page)}
>
{page}
</button>
</li>
))}
</ul>
)}
</>
);
};
export default Pagination;
Pagination.css
.pagination {
list-style: none;
display: flex;
justify-content: center;
flex-wrap: wrap;
margin: 16px;
}
.pagination_button {
width: 40px;
height: 40px;
margin: 0 10px;
font-size: 16px;
font-weight: 600;
border: 1px solid #e5e5e5;
border-radius: 6px;
background-color: #fff;
color: #000;
cursor: pointer;
transition: all 0.2s ease-in-out;
}
.pagination_button.active {
background-color: #000;
color: #fff;
}
ProductsList.jsx์ ์๊น ํ ์คํธ๋ก 2ํ์ด์ง ๋ฃ์๋ ๋ฒํผ์ ์ง์ฐ๊ณ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
</div>
{data && (
<Pagination
total={data.totalProducts}
perPage={8}
onClick={handlePageChange}
currentPage={page}
/>
)}
</section>

'FRONTEND > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [myCart] ๋ก๋ฉ ์ค ํ๋ฉด ํ์ํ Loader ์ปดํฌ๋ํธ ์์ฑ (1) | 2023.12.20 |
|---|---|
| [myCart] ์ํ ์์ธ ํ์ด์ง (1) | 2023.12.20 |
| [myCart] ์นดํ ๊ณ ๋ฆฌ ๋ณ ์ํ ์ถ๋ ฅ (0) | 2023.12.20 |
| [myCart] ๋ฆฌ์กํธ ๋ก๋ฉ ์ค์ผ๋ ํค ์ ์ฉ (0) | 2023.12.20 |
| [myCart] ์ปค์คํ Hook ์์ฑ ํ ์ ์ฉ (0) | 2023.12.20 |