Programming/개인 작업🌻

[Pagination - 릴레이 블로깅 첼린지 -] React로 Pagination 구하기

감귤밭호지차 2023. 4. 24. 23:51

 

 

Title : 리액트로 페이지네이션 구현하기

드디어 염원하던 리액트로 페이지네이션을 구현해보았습니다. 추후 CRUD 기능, 검색 기능을 구현해보고 싶습니다. 

 

 

페이지네이션 라이브러리

페이지네이션을 구현하는 라이브러리 중 인기 상위인 페이지네이션 라이브러리 입니다. 라이브러리를 이용해서 구현해보지는 않았지만 라이브러리를 적용하는 방법을 익히기 위해 따로 공부해보아야 할 것 같습니다. 

 

  1. react-js-pagination

 

리액트로 페이지네이션 구현하기

 

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}> 
            &lt;
            </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}
            >&gt;</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로 페이지네이션 구현하기

참고 블로그