[DAY - 88] Redux 장바구니 예제

2023. 7. 8. 12:04·🔥 부트캠프-웹 개발 🔥/React
                {
                    cart.length === 0 ? <div className='cart-empty'><h2>장바구니 비어있음</h2><Link to='/'>쇼핑하러 가기</Link></div>
                        :
                        <div className='total'>
                            <span>총 개수 : {cart.length}</span>
                            <span>총 금액 : {totalPrice.toLocaleString('kr-KR')}</span>
                            <span></span>
                        </div>
                }

 
Redux, Router를 이용해서 장바구니 페이지를 구현했다.
 

1) Router 구조

const App = () => {
  return (
    <BrowserRouter>
      <Routes >
        <Route path="/" element={<Layout />}>
          <Route index element={<Home />} />
          <Route path="/cart" element={<Cart />} />
        </Route>
      </Routes>
    </BrowserRouter>
  );
};

export default App;
const Layout = () => {
    return (
        <div id="wrap">
            <Header />
            <main className="main">
                <Outlet />
            </main>
            <Footer />
        </div>
    );
};

 
Layout, Outlet을 이용해서 header와 footer를 항상 표시되게 했다.
Home엔 아이템들이 출력된다.
 

2) 장바구니 버튼

 
주문하기 버튼을 클릭하면 버튼이 취소하기로 변경이 되고 우측 상단에 장바구니에 담긴 총 아이템 개수를 나타내준다.
 

                <li><Link to='/cart'>Cart / {cart.length}</Link></li>

 
개수를 나타내 주는 navigation 부분
 

                {
                    cart.find(item => item.id === id) ?
                        <button onClick={() => dispatch(removeCart(id))} className='off'>취소하기</button>
                        :
                        <button onClick={() => dispatch(addCart(item))}>주문하기</button>
                }

 
 
 
장바구니에 담기지 않았을 때 주문하기 버튼을 클릭하면 addCart 함수를 호출하고, 담긴 상태면 취소하기 버튼이 활성화되며 클릭 시 removeCart 함수를 호출한다.
 

        addCart(state, action) {
            state.cart = [...state.cart, action.payload];
        },
        removeCart(state, action) {
            state.cart = state.cart.filter(item => item.id !== action.payload)
        }

 
각각 item(객체 전부), id를 매개변수로 넘겨주기 때문에 cart 배열에 추가해 주고, 해당 id로 제거해 주는 기능을 한다.
 

3) 장바구니

    <article>
      <img src={image} alt={title} />
      <div>
        <h3> {title} </h3>
        <span>{
          price === 0 ? '무료' : `${price.toLocaleString("kr-KR")} 원`
        }</span>
      </div>
      <button onClick={() => dispatch(removeCart(id))}> 삭제 </button>
    </article>

 
장바구니에 담긴 상품의 삭제 버튼을 누르면 마찬가지로 removeCart 함수를 호출해 cart 배열에서 해당 아이템의 객체를 제거하게 된다.
 

                {
                    cart.length === 0 ? <div className='cart-empty'><h2>장바구니 비어있음</h2><Link to='/'>쇼핑하러 가기</Link></div>
                        :
                        <div className='total'>
                            <span>총 개수 : {cart.length}</span>
                            <span>총 금액 : {totalPrice.toLocaleString('kr-KR')}</span>
                            <span></span>
                        </div>
                }

 
장바구니에 담긴 상품이 없을 시(cart.length===0) 장바구니가 비어있다는 텍스트가 출력이 되고, 장바구니에 아이템이 있을 시 총 개수와 총금액을 알려준다.
 

    const totalPrice = cart.reduce((total, item) => total + item.price, 0);

 
총금액의 경우 cart 배열 안의 price의 값만 더해주면 되기 때문에 reduce를 사용하였다.

'🔥 부트캠프-웹 개발 🔥/React' 카테고리의 다른 글
  • [DAY - 89] Redux 게시판 예제
  • [DAY - 87] React 예제 Redux 사용 재구현
  • [DAY - 86] Redux 예제
  • [DAY - 85] Redux
Yeonhub
Yeonhub
✨ https://github.com/yeonhub 📧 lsy3237@gmail.com
  • Yeonhub
    비 전공자의 Be developer
    Yeonhub
  • 전체
    오늘
    어제
    • 전체보기 (169)
      • 🔍 Tech 🔍 (19)
        • Front-End (11)
        • Back-End (4)
        • AI (1)
        • Server (1)
        • Etc (2)
      • 💡 원티드 프리온보딩 챌린지 💡 (14)
        • PRE-ONBOARDING_AI (11월) (1)
        • PRE-ONBOARDING_FE (2월) (2)
        • PRE-ONBOARDING_FE (1월) (2)
        • PRE-ONBOARDING_FE (12월) (9)
      • 🔥 부트캠프-웹 개발 🔥 (118)
        • HTML5 (7)
        • CSS3 (21)
        • JavaScript (27)
        • JavaScript_advanced (9)
        • React (24)
        • Next (1)
        • MYSql (5)
        • Node (5)
        • 오늘하날(개인프로젝트) (12)
        • 이젠제주투어(팀프로젝트) (7)
      • 💻 CS 💻 (1)
        • 알고리즘 (1)
      • ⚡ 코딩테스트 ⚡ (11)
        • JavaScript (11)
      • 📚 Books 📚 (6)
        • 클린 아키텍처 (2)
        • 인사이드 자바스크립트 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    컴파운드 컴포넌트 패턴
    expo map
    expo 지도
    expo deep linking
    node cron
    node.js fcm
    expo fcm push
    react native firebase analytics
    expo node fcm
    expo google map
    라스콘4
    라스콘
    javascript fcm
    expo admob
    php node
    프론트엔드 테스트코드
    react native analytics
    expo fcm
    react native bottom sheet
    rn admob
    node crontab
    react native admob
    node fcm
    react vite
    react native expo fcm
    python node
    bottom sheet
    expo 길찾기
    Node
    rn bottom sheet
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Yeonhub
[DAY - 88] Redux 장바구니 예제
상단으로

티스토리툴바