[React]Cmarket Hooks

이정원·2022년 8월 5일
0

장바구니에 상품을 추가할 때 상품수량이 증가하고, 중복된 상품은 추가하지 않으며, 장바구니에서 삭제할시 수량이 줄어들고 금액또한 줄어드는 코드이다.

App.js

import React, { useState } from 'react';
import Nav from './components/Nav';
import ItemListContainer from './pages/ItemListContainer';
import './App.css';
import {
  BrowserRouter as Router,
  Switch,
  Route,
} from "react-router-dom";
import ShoppingCart from './pages/ShoppingCart';
import { initialState } from './assets/state';

function App() {

  const [items, ] = useState(initialState.items);
  const [cartItems, setCartItems] = useState(initialState.cartItems);
  const removeFromCart = function(itemId){
  return setCartItems(cartItems.filter(function(el){
  return el.itemId !== itemId
  }))
 }
 
 const addToCart = function(itemId){
 const found = cartItems.filter(function(el){
 return el.itemId === itemId
 })[0]
 if(found){
 console.log('found')
 setQuantity(itemId, found.quantity + 1)
 }
 else{
 console.log('add new')
 setCartItems([...cartItems, {
 itemId, quantity: 1,
 }])
}
}

const setQuantity = function(itemId, quantity){
const found = cartItems. filter(function(el){
return el.itemId === itemId
})[0]
const idx = cartItems.indexOf(found)
const cartItem = {
itemId, quantity,
}
setCartItems([...cartItems.slice(0, idx), cartItem, ...cartItems.slice(idx + 1)])
}

  return (
    <Router>
      <Nav cartItems={cartItems}/>
      <Switch>
        <Route exact={true} path="/">
          <ItemListContainer items={items} handleAdd={addToCart}/>
        </Route>
        <Route path="/shoppingcart">
          <ShoppingCart cartItems={cartItems} items={items} handleDelete={removeFromCart} handleQuantityChange={setQuantity}/>
        </Route>
      </Switch>
    </Router>
  );
}

export default App;

Nav.js

import React from 'react';
import { Link } from 'react-router-dom';

function Nav({cartItems) {

  return (
    <div id="nav-body">
      <span id="title">
        <img id="logo" src="../logo.png" alt="logo" />
        <span id="name">CMarket</span>
      </span>
      <div id="menu">
        <Link to="/">상품리스트</Link>
        <Link to="/shoppingcart">
          장바구니<span id="nav-item-counter">{cartItems.length}</span>
        </Link>
      </div>
    </div>
  );
}

export default Nav;

ItemListContainer.js

import React from 'react';
import Item from '../components/Item';

function ItemListContainer({ items, handleAdd }) {
  const handleClick = () => { }
  return (
    <div id="item-list-container">
      <div id="item-list-body">
        <div id="item-list-title">쓸모없는 선물 모음</div>
        {items.map((item, idx) => <Item item={item} key={idx} handleClick={function(){
        return handleAdd(item.id)
        }} />)}
      </div>
    </div>
  );
}

export default ItemListContainer;

ShoppingCart.js

import React, { useState } from 'react'
import CartItem from '../components/CartItem'
import OrderSummary from '../components/OrderSummary'

export default function ShoppingCart({ items, cartItems, handleDelete: onDelete, handleQuantityChange: onQuantityChange }) {
  const [checkedItems, setCheckedItems] = useState(cartItems.map((el) => el.itemId))

  const handleCheckChange = (checked, id) => {
    if (checked) {
      setCheckedItems([...checkedItems, id]);
    }
    else {
      setCheckedItems(checkedItems.filter((el) => el !== id));
    }
  };

  const handleAllCheck = (checked) => {
    if (checked) {
      setCheckedItems(cartItems.map((el) => el.itemId))
    }
    else {
      setCheckedItems([]);
    }
  };

  const handleQuantityChange = (quantity, itemId) => { onQuantityChange(itemId, quantity)
  }

  const handleDelete = (itemId) => {
    setCheckedItems(checkedItems.filter((el) => el !== itemId))
    onDelete(itemId)
  }

  const getTotal = () => {
    let cartIdArr = cartItems.map((el) => el.itemId)
    let total = {
      price: 0,
      quantity: 0,
    }
    for (let i = 0; i < cartIdArr.length; i++) {
      if (checkedItems.indexOf(cartIdArr[i]) > -1) {
        let quantity = cartItems[i].quantity
        let price = items.filter((el) => el.id === cartItems[i].itemId)[0].price

        total.price = total.price + quantity * price
        total.quantity = total.quantity + quantity
      }
    }
    return total
  }

  const renderItems = items.filter((el) => cartItems.map((el) => el.itemId).indexOf(el.id) > -1)
  const total = getTotal()

  return (
    <div id="item-list-container">
      <div id="item-list-body">
        <div id="item-list-title">장바구니</div>
        <span id="shopping-cart-select-all">
          <input
            type="checkbox"
            checked={
              checkedItems.length === cartItems.length ? true : false
            }
            onChange={(e) => handleAllCheck(e.target.checked)} >
          </input>
          <label >전체선택</label>
        </span>
        <div id="shopping-cart-container">
          {!cartItems.length ? (
            <div id="item-list-text">
              장바구니에 아이템이 없습니다.
            </div>
          ) : (
              <div id="cart-item-list">
                {renderItems.map((item, idx) => {
                  const quantity = cartItems.filter(el => el.itemId === item.id)[0].quantity
                  return <CartItem
                    key={idx}
                    handleCheckChange={handleCheckChange}
                    handleQuantityChange={handleQuantityChange}
                    handleDelete={handleDelete}
                    item={item}
                    checkedItems={checkedItems}
                    quantity={quantity}
                  />
                })}
              </div>
            )}
          <OrderSummary total={total.price} totalQty={total.quantity} />
        </div>
      </div >
    </div>
  )
}

블로그에서 다시 작성한 코드이므로 오타가 있을 수 있습니다.

profile
Study.log

0개의 댓글