App.jsx
const [cart, setCart] = useState([]); //์ฅ๋ฐ๊ตฌ๋
App.jsx์์ ์ฅ๋ฐ๊ตฌ๋ ๊ฐ์๋ฅผ ํ์ํ cart useState๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ Navbar์ปดํฌ๋ํธ์ cartCount๋ก cart ๋ฐฐ์ด์์ ๊ฐ์๋ฅผ props๋ก ์ ๋ฌํ๋ค.
<Navbar user={user} cartCount={cart.length} />
Navbar.jsx
const Navbar = ({ user, cartCount }) => {
App.jsx์์ ์ ๋ฌ๋ฐ์ props๋ก
์ฅ๋ฐ๊ตฌ๋์ ํ์ํ๋ค.
<NavLink to="/cart" className="align_center">
์ฅ๋ฐ๊ตฌ๋ <p className="align_center cart_counts">{cartCount}</p>
</NavLink>
๊ทธ๋ฆฌ๊ณ ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ ๋ด์ ์ ์๋ ํจ์๋ฅผ ์ถ๊ฐํ๋ค.
//์ฅ๋ฐ๊ตฌ๋์ ์ํ ์ถ๊ฐ
const addToCart = (product, quantity) => {
//๊ธฐ์กด์ ์นดํธ ๋ฐ์ดํฐ ๋ค์ ์๋ก์ด ๋ฐ์ดํฐ ์ถ๊ฐ
setCart([...cart, { product, quantity }]);
};
๋ผ์ฐํ
์ปดํฌ๋ํธ์ ๋ง๋ ํจ์ ์ ๋ฌํ๋ค.
return (
<div className="app">
<Navbar user={user} cartCount={cart.length} />
<main>
<Routing addToCart={addToCart} />
</main>
</div>
);
Routing.jsx์์ SingleProductPage์ props๋ก ํจ์ ์ ๋ฌ
const Routing = ({ addToCart }) => {
return (
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/products" element={<ProductsPage />} />
<Route
path="/product/:id"
element={<SingleProductPage addToCart={addToCart} />}
/>
<Route path="/signup" element={<SignupPage />} />
<Route path="/login" element={<LoginPage />} />
<Route path="/cart" element={<CartPage />} />
<Route path="/myorders" element={<MyOrderPage />} />
<Route path="/logout" element={<Logout />} />
</Routes>
);
};
SingleProductPage.jsx
const SingleProductPage = ({ addToCart }) => {
props๋ก addTocart ํจ์ ๋ฐ์์์
์ฅ๋ฐ๊ตฌ๋๋ฅผ ํด๋ฆญํ ๋๋ง๋ค ์คํํ๋๋ก onclick ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ค.
<button
onClick={() => addToCart(product, quantity)}
className="search_button add_cart"
>
์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ
</button>
ํ์ง๋ง ๊ฐ์ ์ ํ์ ๊ฒฝ์ฐ์๋ ๊ณ์ ์ฅ๋ฐ๊ตฌ๋๊ฐ ์ถ๊ฐ๋๋ ํ์์ด ๋ฐ์ํจ .
์ด๋ฌํ ํ์์ ๋ฐฉ์งํ๊ธฐ ์ํด์
//์ฅ๋ฐ๊ตฌ๋์ ์ํ ์ถ๊ฐ
const addToCart = (product, quantity) => {
const updatedCart = [...cart]; //๊ธฐ์กด์ ์นดํธ
//findIndex๋ ๋ชจ๋ ๋ฐฐ์ด์์ดํ
๊ณผ ๋น๊ตํด์ ์ฐธ์ด ์์ผ๋ฉด true๋ฅผ ๋ฆฌํดํ๊ณ ์์ผ๋ฉด -1
const productIndex = updatedCart.findIndex(
(item) => item.product._id === product._id
);
if (productIndex === -1) {
updatedCart.push({ product: product, quantity: quantity });
} else {
updatedCart[productIndex].quantity += quantity;
}
setCart(updatedCart);
};
์ด๋ฏธ ๊ฐ์ ์ ํ์ด ์ฅ๋ฐ๊ตฌ๋์ ๋ค์ด๊ฐ์์ ๊ฒฝ์ฐ ์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ๋ฅผ ๋๋ฌ๋ ์ฅ๋ฐ๊ตฌ๋ ๊ฐ์๊ฐ ๋์ด๋์ง์๋๋ค.
์ฅ๋ฐ๊ตฌ๋ cart์ ์ ์ ํ๊ณผ ์๋์ ์
๋ฐ์ดํธ ํ๋ ์์ฒญ์
ํฌ์คํธ๋งจ์์ ํ
์คํธํ๋ค.
http://localhost:5000/api/cart/1
import apiClient from "./api-client";
//axios์ ํค๋์ ํ ํฐ์ ์ถ๊ฐํ๋ค.
const setAuthToken = (token) => {
if (token) {
apiClient.defaults.headers.common["x-auth-token"] = token;
} else {
delete apiClient.defaults.headers.common["x-auth-token"];
}
};
export default setAuthToken;
App.jsx์์ ์ค์ ํจ
setAuthToken(localStorage.getItem("token"));
function App() {
servies ํด๋ ์์ cartServices.js ํ์ผ์ ์์ฑํ๋ค.
import apiClient from "../utils/api-client";
//์นดํธ์ ์ ํ id์ ์๋์ ์ถ๊ฐํ๋ ์์ฒญ
export function addToCartAPI(id, quantity) {
return apiClient.post(`/cart/${id}`, { quantity });
}
mongoDbํ์ธ ์ Array์ ๊ฐ์๋ ์ฆ๊ฐํ์ง ์์๊ณ ,
quantity ๊ฐ์๋ง ์
๋ฐ์ดํธ๋จ์ ํ์ธ ํ ์ ์๋ค.