APP.js
import React, { useState } from 'react';
import Nav from './components/Nav';
import ItemListContainer from './pages/ItemListContainer';
import './App.css';
import './variables.css';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import ShoppingCart from './pages/ShoppingCart';
import { initialState } from './assets/state';
function App() {
const [items, setItems] = useState(initialState.items);
const [cartItems, setCartItems] = useState(initialState.cartItems);
// cartItems={cartItems} setCartItems={setCartItems}์ props๋ก ๋๊ฒจ์ค๋ค
return (
<Router>
<Nav />
<Routes>
<Route path="/" element={<ItemListContainer items={items} cartItems={cartItems} setCartItems={setCartItems}/>} />
<Route
path="/shoppingcart"
element={<ShoppingCart cartItems={cartItems} items={items} setCartItems={setCartItems}/>}
/>
</Routes>
<img
id="logo_foot"
src={`${process.env.PUBLIC_URL}/codestates-logo.png`}
alt="logo_foot"
/>
</Router>
);
}
export default App;
โ ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐ
๋ฉ์ธ ํ๋ฉด์์ [์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ] ๋ฒํผ์ ๋๋ฅธ ํ, ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๋ก ์ด๋ํ๋ฉด ์ํ์ด ๋ด๊ฒจ์์ด์ผ ํฉ๋๋ค.
ItemListContainer.js
onClick={(e) => handleClick(e, item.id)
์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ ๋ฒํผ์ด ์คํ๋ ์์ ๋ฐ๋ ์ธ์
import React from 'react';
import Item from '../components/Item';
function ItemListContainer({ items, cartItems, setCartItems }) {
const handleClick = (e, id) => {
let newItem = cartItems
let num = cartItems.findIndex((e) => e.itemId === id) // x-> -1
if (num !== -1){
newItem[num].quantity++
setCartItems(newItem)
} else setCartItems([...newItem, {"itemId":id, "quantity":1}])
}
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={handleClick} />)}
</div>
</div>
);
}
export default ItemListContainer;
์ด๊ฑด findIndex๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค๋ ๊ฑธ ์์์ ๋.. ๋จธ๋ฆฌ ์ธ๋งค๋ฉฐ ๊ตฌํํ๋ ์ฝ๋
else {
setCartItems([...newItem,
{"itemId": id,
"quantity": 1}
])
}
์๋ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ฒจ์์ง ์๋ ์์ดํ
์ ๋ฃ์์ ๋
์๋กญ๊ฒ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ด ์ ์๊ฐ์ด ๋์ง ์์์ ์ ๋จน์๋ ๋ถ๋ถ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฒ์์ for๋ฌธ์ ์ด์ฉํด์ ์ถ๊ฐํ๋ ์ฝ๋
function ItemListContainer({ items, cartItems, setCartItems}) {
const handleClick = (e, id) => { // ํด๋ฆญ์ ํ๋ฉด ํด๋ฆญํ ๊ฐ์ ์์ด๋๋ฅผ ๊ฐ์ ธ์ด
let newCartItem = {};
newCartItem.itemId = id;
newCartItem.quantity = 1;
for (let i = 0; i < cartItems.length; i++){
if (cartItems[i].itemId === id){ // ํด๋ฆญํ ์ํ๊ณผ ํ์ฌ ์ํ์ (id)๋น๊ต, ์์ผ๋ฉด +1 ํด์ ๋ฆฌ์คํธ์ ์ถ๊ฐ๋ง ํ๊ณ
setCartItems([...cartItems])
cartItems[i].quantity++
} else setCartItems([...cartItems, newCartItem]) // ์์ผ๋ฉด ์๋กญ๊ฒ ์ถ๊ฐ (์๋์ผ๋ก 1์ด๋๊ฒ..? -> ์ฒ์์ quantity = 1 ๋ก ์ค์ )
}
}
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={handleClick} />)}
</div>
</div>
);
}
โ ์ฅ๋ฐ๊ตฌ๋ ๊ฐ์ ์ซ์ ํ์
๋ด๋น๊ฒ์ด์ ๋ฐ์ ์ํ ๊ฐ์๊ฐ ์ฆ์ ํ์๋์ด์ผ ํฉ๋๋ค.
App.js
<Router>
...
<Nav cartItems={cartItems}/>
...
</Router>
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;
โ ์ํ ๊ฐ์ ๋ณ๊ฒฝํ๊ธฐ
์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์์ ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ๊ฐ ์์ดํ ์ ๊ฐ์๋ฅผ ๋ณ๊ฒฝํ ์ ์์ด์ผ ํฉ๋๋ค.
cartitem.js ์์
onChange={(e) => {
handleQuantityChange(Number(e.target.value), item.id)
}}
๋ฐ๊ฒฌ
์ฒ์์ handleQuantityChange ํจ์๋ฅผ
const handleQuantityChange = (quantity, itemId) => {
let idx = cartItems.findIndex((el) => el.itemId === itemId)
cartItems[idx].quantity = quantity
setCartItems(cartItems)
}
์ด๋ ๊ฒ ํ๋๋ฐ ๋ฐ๋์ง๊ฐ ์์๋ค..
ํ์ด๋ถ์ด ์๋ ค์ฃผ์
จ๋๋ฐ ์ด๊ฒ ์ฐธ์กฐ๊ฐ์ด๋ผ ์์ ๋ณต์ฌ๋ผ์ ์ํ ๊ฐ์ ์ ์ ์ ์ฅ๋ง ํ ๊ฒ์ด๋ผ์ ๊ทธ๋ฐ ๊ฑฐ๋ผ๊ณ .. ์ด ์ค์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅํ๋ ค๋ฉด ๊น์ ๋ณต์ฌ๋ฅผ ํด์ผํ๋ค๊ณ ํ๋ค.
ShoppingCart.js
export default function ShoppingCart({ items, cartItems, setCartItems }) {
...
const handleQuantityChange = (quantity, itemId) => {
let newCartItems = [...cartItems]
let idx = cartItems.findIndex((el) => el.itemId === itemId)
newCartItems[idx].quantity = quantity
setCartItems(newCartItems)
}
...
}
๋ค๋ฅธ ๋ฐฉ๋ฒ
App.js
const Quantity = (itemId, quantity) => {
const itemList = cartItems.filter((el) => el.itemId === itemId)[0] // ์ถ๊ฐ๋ ์์ดํ
const index = cartItems.indexOf(itemList)
const cartItem = {
"itemId" : itemId,
"quantity" : quantity
}
setCartItems([...cartItems.slice(0, index),
cartItem,
...cartItems.slice(index + 1, cartItems.length)])
}
- [0]์ ๋ถ์ฌ์ฃผ๋ ์ด์ ?
๋ฐฐ์ด ์ํ๋ก ๊ฐ์ธ์ ธ์ ํค:๊ฐ ์์ ์ ๊ทผ์ ํ๊ธฐ ์ํด ํด์ค๋ค.
๊ดํธ๋ฅผ ๋ฒ๊ธฐ๋ ๋๋
Shoppingcart.js
const handleQuantityChange = (quantity, itemId) => {
Quantity(itemId, quantity)
}
โ ์ฅ๋ฐ๊ตฌ๋๋ก๋ถํฐ ์ ๊ฑฐ
์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์์ [์ญ์ ] ๋ฒํผ์ ๋๋ฅธ ํ, ํด๋น ์ํ์ด ๋ชฉ๋ก์์ ์ญ์ ๋์ด์ผ ํฉ๋๋ค.
cartitem.js ๋ด ๋ฒํผ ๋ถ๋ถํ์ธ
<button className="cart-item-delete" onClick={() => {
handleDelete(item.id) }
}>์ญ์ </button>
ShoppingCart.js
export default function ShoppingCart({ items, cartItems, setCartItems }) {
const handleDelete = (itemId) => {
setCheckedItems(checkedItems.filter((el) => el !== itemId))
setCartItems(cartItems.filter((el)=> el.itemId !== itemId))
}
...
'Lecture > ์ฝ๋์คํ ์ด์ธ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SEB FE] Section3 unit 4 (3) Cmarket Redux (0) | 2023.05.18 |
---|---|
[SEB FE] Section3 unit 4 REDUX (0) | 2023.05.18 |
[SEB FE] Section3 unit 2 UI/UX , figma ํด๋ก (0) | 2023.05.17 |
[SEB FE] Section3 unit 1 ์ฌ๊ท - JSON.stringify (0) | 2023.05.17 |
[SEB FE] Section3 unit 1 ์ฌ๊ทํจ์ ๋ฌธ์ ํ์ด (1) | 2023.05.17 |