오픈마켓 프로젝트를 진행하던중 장바구니 페이지에서 전체 상품을 가져와야 하는 일이 생겼는데 api가 페이징 처리가 되어 있어서 한번에 데이터를 가져올 방법을 생각해봐야 했다.
const itemCount = useSelector((state) => state.product.count)
const pageNumbers = [];
console.log("아이템카운트", itemCount)
for (let i = 1; i <= Math.ceil(itemCount / 15); i++) {
pageNumbers.push(i);
}
useEffect(() => {
pageNumbers.map((p) => {
return dispatch(getProductDB(p))
})
}, [dispatch, pageNumbers])
useEffect(() => {
if (pageNumbers.length-1<Math.ceil(itemCount / 15)) {
pageNumbers.map((p) => {
return dispatch(getProductDB(p))
})
}
}, [dispatch, itemCount])
//ShoppingCart.js
const itemCount = useSelector((state) => state.product.count)
const pageNumbers = [];
console.log("아이템카운트", itemCount)
for (let i = 1; i <= Math.ceil(itemCount / 15); i++) {
pageNumbers.push(i);
}
pageNumbers.shift()
useEffect(() => {
if (itemCount > 1 && productList.length < itemCount) {
pageNumbers.map((p) => {
return dispatch(getProductDB(p))
})
} else if (itemCount <= 1) {
dispatch(getProductDB(1))
}
}, [dispatch, itemCount])
// product.js (Redux)
const GETPRODUCT = "product/GETPRODUCT";
const initialState = {
products: [],
count: 1,
productOne: [],
sellerProducts: [],
}
const getProduct = createAction(GETPRODUCT, (products, count) => ({ products, count }))
export const getProductDB = (page) => {
console.log(page)
return async function (dispatch) {
await apis.getProduct(page)
.then((res) => {
console.log("상품", res.data)
dispatch(getProduct(res.data.results, res.data.count))
})
.catch((error) => {
console.log("상품에러", error)
return;
})
}
}
export default handleActions(
{
[GETPRODUCT]: (state, action) =>
produce(state, (draft) => {
console.log(action.payload)
draft.products = draft.products.concat(action.payload.products)
draft.count = action.payload.count
}),
},
initialState
);
const [page, setPage] = useState(1)
const [list, setList] = useState([])
useEffect(()=>{
api.get(`/products/?page=${page}`).then((res) => {
setList((prev) => prev.concat(res.data.results))//리스트 추가
setPage(prev => prev + 1)
}).catch((error) => {
setMoreData(false)
return;
})
})
위처럼 redux가 아닌 app.js에서 데이터를 받아올때마다 page+1을 해줘서 데이터를 가져오는 간단한 방법도 있지만 지금은 작은 규모의 프로젝트여서 상품리스트를 가져올 일이 그렇게 많진 않지만 이게 큰 규모였다면 페이지마다 상품리스트를 가져다 사용할 일이 많다고 생각이 들어서 redux를 사용해서 데이터를 가져오는 방법이 더 낫다고 생각되었다..