NODE.JS
OnlineShop 만들기 - 11) Cart Page 만들기 2 (cart 페이지 템플릿 만들기)
dodop
2021. 5. 16. 16:54
카트 페이지 템플릿을 만들고 db에서 가져온 데이터를 화면에 보여주도록 하자.
cartpage에 템플릿을 추가하자.
여기서 테이터를 보여주는 userCardBlock을 따로 만들것이다.
import UserCardBlock from './Sections/UserCartBlock';
import { Result, Empty } from 'antd';
return (
<div style={{ width: '85%', margin: '3rem auto' }}>
<h1>My Cart</h1>
<div>
<UserCardBlock
/>
<div style={{ marginTop: '3rem' }}>
<h2>Total amount: ${Total} </h2>
</div>
//아이템이 있을때
<Result
status="success"
title="Successfully Purchased Items"
/>
//아이템이 없을 때
<div style={{
width: '100%', display: 'flex', flexDirection: 'column',
justifyContent: 'center'
}}>
<br />
<Empty description={false} />
<p>No Items In the Cart</p>
</div>
}
</div>
{/* Paypal Button */}
</div>
)
}
CartPage>Sections>UserCardBlock.js파일을 만들어준다.
import React from 'react'
function UserCardBlock(props) {
return (
<div>
<table>
<thead>
<tr>
<th>Product Image</th>
<th>Product Quantity</th>
<th>Product Price</th>
<th>Remove from Cart</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
)
}
export default UserCardBlock
로그인이 된 상태라면 리덕스에 사용자 정보가 저장되어 있으니, 이용해서 화면에 나타나도록 해보자.
우선 UserCardBlock에 props 정보를 넘겨줘서 이 정보를 이용해서 화면구성을 해보도록 하자.
<UserCardBlock
products={props.user.cartDetail}
/>
import React from 'react'
function UserCardBlock(props) {
const renderItems = () => (//아이템들을 화면에 나타나도록 하자.
props.products && props.products.map(product => (//상품이 카트에 있다면
<tr key={product._id}>
<td>
<img style={{ width: '70px' }} alt="product"
src={renderCartImage(product.images)} />
</td>
<td>{product.quantity} EA</td>
<td>$ {product.price} </td>
<td><button
onClick
>Remove </button> </td>
</tr>
))
)
return (
<div>
<table>
<thead>
<tr>
<th>Product Image</th>
<th>Product Quantity</th>
<th>Product Price</th>
<th>Remove from Cart</th>
</tr>
</thead>
<tbody>
{renderItems()}
</tbody>
</table>
</div>
)
}
export default UserCardBlock
이미지도 가져오자.
여기서 저장된 이미지가 1개가 아니기 때문에 http://localhost/5000/${product.image}의 형식으로 가져올 수 없다(여러개이기 때문에 뭘 가져올지 모른다)
따로 함수로 빼내서 구현해주자.
const renderCartImage = (images) => {//첫번째 사진을 보여주도록 한다.
if(images.length > 0) {
let image = images[0]
return `http://localhost:5000/${image}`
}
}
const renderItems = () => (//아이템들을 화면에 나타나도록 하자.
props.products && props.products.map(product => (//상품이 카트에 있다면
<tr key={product._id}>
<td>
<img style={{ width: '70px' }} alt="product"
src={renderCartImage(product.images)} />
</td>
<td>{product.quantity} EA</td>
<td>$ {product.price} </td>
<td><button
onClick
>Remove </button> </td>
</tr>
))
)
total amount를 계산해서 보여주도록 하자.
import React, { useEffect , useState} from 'react'
const [Total, setTotal] = useState(0)
//total amount
useEffect(() => {
if(props.user.cartDetail&&props.user.cartDetail.length>0){
calculateTotal(props.user.cartDetail)
}
}, [props.user.cartDetail])//페이지 들어가거나 변경될 때마다 자동 업데이트
const calculateTotal = (cartDetail) =>{
let total = 0;
cartDetail.map(item=>{
total += parseInt(item.price, 10)*item.quantity
})
setTotal(total)
}
<div style={{ marginTop: '3rem' }}>
<h2>Total amount: ${Total} </h2>
</div>