프론트엔드 정복하기
React hooks로 페이지네이션(pagination) 본문
1) useState 설정
const [Products, setProducts] = useState([])
const [loading, setloading] = useState(false)
const [currentPage, setcurrentPage] = useState(1)
const [productsPerPage, setproductsPerPage] = useState(10)
2) useEffect에서 데이터 불러오기
useEffect(() => {
setloading(true);
let body={category:'인생뷰티'}
Axios.post('/api/product/lists', body)
.then(response=>{
if(response.data.success){
setProducts(response.data.products)
setloading(false)
}
})
}, [])
loading =true => axios에서 데이터 전체 불러오기 => loading = false
3) 전체 item을 FirstProduct와 lastProduct index로 slice
//Get Current Products
const indexOfLastProduct = currentPage*productsPerPage;
const indexOfFirstProduct = indexOfLastProduct-productsPerPage;
const currentProduct=Products.slice(indexOfFirstProduct, indexOfLastProduct)
const productBox=currentProduct.map((product, index)=>{
return(
<ProdList product={product} loading={loading} />
)
})
전체 item을 FirstProduct와 lastProduct index로 slice 한다.
( 예) 1페이지 : 1~10 / 2페이지 : 11~20 / .... )
4) slice한 item에 mapping => name, image 등 설정
5) 페이지네이션 설정
<Pagination onChange={(page)=>{setcurrentPage(page)}} defaultCurrent={1} total={Products.length} defaultPageSize={productsPerPage}/>
-currentPage state
=> 클릭한 page setting
=> currentPage state가 변동되면서 slice 인자들이 변동된다.
=> 페이지수에 따라 slice된 item들이 보이게 된다.
6) loading
{loading ? (
<div style={{width:'100%', textAlign:'center', padding:'50px 0'}}>Loading...</div>
)
: (
<div className="prodList">
{productBox}
</div>
)}
참고사이트
'React > hooks' 카테고리의 다른 글
주소창 parameter 사용하기 (0) | 2020.09.11 |
---|---|
React useState로 select 처리하기 (0) | 2020.08.21 |
React hooks 데이터 불러와서 뿌리기 (0) | 2020.08.21 |
React에서 여러개의 input state 관리하기(useReducer 이용) (0) | 2020.07.07 |
React Hooks 완벽 정복하기(도움되는 블로그) (0) | 2020.07.07 |