Title : 리액트로 페이지네이션 구현하기
드디어 염원하던 리액트로 페이지네이션을 구현해보았습니다. 추후 CRUD 기능, 검색 기능을 구현해보고 싶습니다.
페이지네이션 라이브러리
페이지네이션을 구현하는 라이브러리 중 인기 상위인 페이지네이션 라이브러리 입니다. 라이브러리를 이용해서 구현해보지는 않았지만 라이브러리를 적용하는 방법을 익히기 위해 따로 공부해보아야 할 것 같습니다.
리액트로 페이지네이션 구현하기
Component 나누기
App.js
┗ main : 메인 글 목록들과 페이지네이션 구현
┗ header : Nav 파트 담당
┗ datas : 임시 dummy datas
Main Component
이 Main 부분에는 ' 현재 페이지에 나타낼 글 목록 ' 과 ' 페이지네이션 '을 구현했습니다.
1. 현재 페이지에 나타낼 글 목록 컴포넌트
import React, {useState} from 'react';
import styled from 'styled-components';
import Pagination from './Pagination';
import './Main.css';
import tempdatas from '../datas/tempdatas';
const Main = () => {
const [posts, setPosts] = useState(tempdatas);
const [limit, setlimit] = useState(10); // setlimit을 통해 화면에 표시될 콘텐츠 수 조절 가능.
const [page, setPage] = useState(1);
const offset = (page -1) * limit;
const Line = styled.div`
width: 100%;
>div{
display: flex;
justify-content: space-around;
border-bottom: 1px solid #efefef;
padding-top: 5px;
padding-bottom: 5px;
>.min{
width: 140px;
padding-left: 10px;
}
>.max{
width: 300px;
text-align:left;
padding-left: 50px;
}
&:hover{
background:#efefef;
cursor:pointer;
}
}
`;
return(
<div className="main">
<div className="main_container">
<h1>고양이</h1>
<div className="main_indexes">
<div className="index_title min">번호</div>
<div className="index_title max">제목</div>
<div className="index_title min">글쓴이</div>
<div className="index_title min">등록일</div>
<div className="index_title min">추천</div>
</div>
<div className="main_lists">
<Line>
{posts.slice(offset, offset + limit).map(({id, title, user, createdAt, cnt}) => (
<div key={id} className="lists_container">
<div className="min">{id}</div>
<div className="max"> {title}</div>
<div className="min"> {user}</div>
<div className="min"> {createdAt}</div>
<div className="min"> {cnt}</div>
</div>
))}
</Line>
</div>
<Pagination
total = {posts.length}
limit = {limit}
page={page}
setPage={setPage}/>
</div>
</div>
)
}
export default Main;
* useState의 posts는 페이지네이션을 구현하기 위해 임시로 만든 데이터인 tempdatas 를 값으로 선정해주었습니다.
CSS의 경우 styled-component로 작성하였기에 JS 파일 안에 같이 있습니다.
2. 페이지네이션 부분
import React from 'react';
import styled from 'styled-components';
const Pagination = ({total, limit, page, setPage}) => {
const numPages = Math.ceil(total/limit);
console.log(numPages);
return(
<>
<Nav>
<Button onClick={() => setPage(page-1)} disabl={page === 1}>
<
</Button>
{Array(numPages)
.fill()
.map((_, i)=>(
<Button
key={i+1}
onClick={() => setPage(i+1)}
aria-current={page === i+1 ? "page" : null}
>{i+1}</Button>
))}
<Button
onClick={() => setPage(page + 1)}
disabled={page === numPages}
>></Button>
</Nav>
</>
)
}
const Nav = styled.nav`
display: flex;
justify-content: center;
align-items:center;
gap: 4px;
margin: 16px;
`;
const Button = styled.button`
border:none;
padding: 8px;
margin: 0;
background-color:white;
/* background: black;
border-radius: 8px;
color: white; */
color:#444;
font-size: 1rem;
&:hover{
/* background: tomato; */
color: darkcyan;
font-weight: bolder;
cursor:pointer;
transform: translateY(-2px);
}
&[disabled] {
/* background: grey; */
cursor: revert;
transform: revert;
}
&[aria-current] {
/* background: deeppink; */
font-weight: bold;
color: darkcyan;
cursor: revert;
transform: revert;
}
`;
export default Pagination;
좀더 내용을 보완 예정
참고 블로그 : [React] 페이지네이션 구현
참고 블로그 : 간단한 페이지네이션 구현하기
참고 블로그 : React로 페이지네이션 구현하기
참고 블로그
'Programming > 개인 작업🌻' 카테고리의 다른 글
[230518 solo 프로젝트 ] (0) | 2023.05.18 |
---|---|
*작성중*[ React ] To Do List 만들기 - 05: API 아이콘 불러오기 + 도시선택 (0) | 2023.05.09 |
[ React ] To Do List 만들기 - 04 : fetch (0) | 2023.04.12 |
[ React ] To Do List 만들기 - 03 (0) | 2023.04.06 |
[ React ] To Do List 만들기 - 02 (0) | 2023.04.03 |