Light Purple Pointer
React Three Fiber(r3f, drei ) ์„ค์น˜ ๋ฐ ๊ธฐ์ดˆ
ยท
FRONTEND/React
Introduction - React Three FiberReact-three-fiber is a React renderer for three.js.r3f.docs.pmnd.rs 1. React-three-fiberReact-three-fiber๋Š” React ๊ธฐ๋ฐ˜์œผ๋กœ Three.js๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. Three.js๋Š” 3D ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง์— ์žˆ์–ด ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด์ง€๋งŒ, DOM๊ณผ๋Š” ๋ณ„๊ฐœ์˜ ๋ Œ๋”๋ง ํ™˜๊ฒฝ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. React-three-fiber๋Š” ์ด๋ฅผ React์˜ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ์™€ ํ†ตํ•ฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.https://r3f.docs.pmnd.rs/getting-started/introduction Introduct..
React Three fiber (R3F) ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
ยท
FRONTEND/React
๊ฐœ๋ฐœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 1. DOM -> React   2. SVG -> D3.js (Data visualizing)https://d3js.org/ D3 by Observable | The JavaScript library for bespoke data visualizationD3 The JavaScript library for bespoke data visualization Create custom dynamic visualizations with unparalleled flexibilityd3js.org  3. Canvas ->Three.js 2D -> p5.js , pixi.js (๊ฒŒ์ž„์—…๊ณ„์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•จ)   3D -> Three.js , babylon.js https://threejs.org/ Thre..
map() ์‚ฌ์šฉ ์‹œ Key๋กœ index๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ณ ์œ ํ•œ ID ๋งŒ๋“ค๊ธฐ
ยท
FRONTEND/React
๋‚˜๋Š” ์ด๋•Œ๊นŒ์ง€ map์„ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋žœ๋”๋ง ํ•  ๋•Œ ๋ณดํ†ต ๋ฐ์ดํ„ฐ์— ์ด๋ฏธ ๊ณ ์œ ํ•œ ID๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ID๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” index๋ฅผ ๋„ฃ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ์ด๋Š” ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•œ๋‹ค.   key์— index ๊ฐ’์„ ๋„ฃ์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ์ด์œ ๋Š” ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์˜ ์ˆœ์„œ๋‚˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ Œ๋”๋ง ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.1. ํ•ญ๋ชฉ ์ˆœ์„œ ๋ณ€๊ฒฝ ์‹œ ๋ฌธ์ œ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด, index ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ๋Š” ํ•ญ๋ชฉ ์ž์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ์ด๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ถˆํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์ž˜๋ชป๋œ ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•ญ๋ชฉ์ด ์‚ฝ์ž…๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋  ๋•Œ, ๊ฐ ํ•ญ๋ชฉ์˜ key๊ฐ€ ์—ฌ์ „ํžˆ ๊ฐ™์€ index ๊ฐ’์„ ๊ฐ€์ง€๋ฉด ๋ฆฌ์•กํŠธ๋Š” ํ•ญ๋ชฉ์ด ๊ทธ๋Œ€๋กœ ์žˆ๋‹ค๊ณ  ์ž˜๋ชป ํŒ๋‹จํ•  ์ˆ˜ ..
[myCart] ์ƒํ’ˆ ๊ฒ€์ƒ‰ํ•˜๊ธฐ / ์ •๋ ฌํ•˜๊ธฐ
ยท
FRONTEND/React
ํ™ˆํŽ˜์ด์ง€ ๊ฒ€์ƒ‰์ฐฝ์— ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅ ํ›„ ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๊ฒฝ์šฐ ProductListํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ•จ Navbar.jsx useState ๋กœ search๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ฒ€์ƒ‰์ฐฝ(input)์˜ ๋‚ด์šฉ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค setSearch๋กœ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ €์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  onSubmit ์ด๋ฒคํŠธ๋กœ ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๊ฒฝ์šฐ handleSubmit์„ ์‹คํ–‰ํ•˜์—ฌ ๊ฒ€์ƒ‰์–ด๊ฐ€ ๊ณต๋ฐฑ์ด ์•„๋‹ ๊ฒฝ์šฐ์—๋งŒ navigate๋ฅผ ์‚ฌ์šฉํ•ด products๋กœ ์ด๋™ํ•œ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” search= ๊ฒ€์ƒ‰์–ด์— ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•ด์„œ ๋ณด๋‚ธ๋‹ค. const Navbar = ({ user, cartCount }) => { const [search, setSearch] = useState(""); //๊ฒ€์ƒ‰์–ด const navigate = useNavi..
[myCart] ํ™ˆํŽ˜์ด์ง€์˜ ์ฃผ์š” ์ œํ’ˆ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ๋ฐ”๋กœ๊ตฌ๋งค ํด๋ฆญ ์‹œ ์ œํ’ˆ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™
ยท
FRONTEND/React
๋Œ€ํ‘œ ์ƒํ’ˆ์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. [GET] ๋Œ€ํ‘œ ์ƒํ’ˆ ๊ฐ€์ ธ์˜ค๊ธฐ - http://localhost:5000/api/products/featured ๊ทธ๋ฆฌ๊ณ  ์ฃผ์š” ์ œํ’ˆ์€ 3๊ฐœ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ํ˜„์žฌ๋Š” ์œ„์™€ ๊ฐ™์ด ์ฃผ์š” ์ œํ’ˆ๋“ค์ด ํ‘œ์‹œ ๋˜๋Š”๋ฐ useData๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐฑ์—”๋“œ์—์„œ ์ฃผ์š” ์ œํ’ˆ์„ ๋ฐ›์•„์˜จ ๋‹ค์Œ์— ProductCard๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด ๋˜๊ฒ ๋‹ค. import useData from "../../Hook/useData"; import ProductCard from "../Products/ProductCard"; import ProductCardSkeleton from "../Products/ProductCardSkeleton"; import "./FeaturedProducts.css"; const Featu..
[myCart] ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐ€๋“œ(๋กœ๊ทธ์ธ ์œ ์ €๊ฐ€ ์•„๋‹ˆ๋ฉด url์ฃผ์†Œ๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€) ์„ค์ •
ยท
FRONTEND/React
์ด๋ฏธ ๋กœ๊ทธ์ธ ๋˜์–ด์žˆ๋Š” ์œ ์ €์˜ ๊ฒฝ์šฐ login ๋ฐ signupํŽ˜์ด์ง€ ์ด๋™ ์‹œ ํ™ˆํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค. import React, { useContext } from "react"; import { Navigate, Route, Routes } from "react-router-dom"; import HomePage from "../Home/HomePage"; import ProductsPage from "../Products/ProductsPage"; import SingleProductPage from "../SingleProduct/SingleProductPage"; import SignupPage from "../Authentication/SignupPage"; import LoginPage from "...
[myCart] ์ฃผ๋ฌธํ•˜๊ธฐ (checkout) ๋ฐ ์ฃผ๋ฌธ ํŽ˜์ด์ง€์—์„œ ๋ฐฑ์—”๋“œ(orders) ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
ยท
FRONTEND/React
orderService.js๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  App.jsx์—์„œ cart ํ”„๋กœ๋ฐ”์ด๋”์— setCart๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. setCart๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๋Š” ํ•จ์ˆ˜ CartPage.jsx์—์„œ setCart๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. const CartPage = () => { const [subTotal, setSubTotal] = useState(0); //๋ฐฐ์†ก๋น„ ์ œ์™ธ ํ•ฉ๊ณ„ const user = useContext(UserContext); const { cart, removeFromCart, updateCart, setCart } = useContext(CartContext); ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ์ œํ•˜๊ธฐ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์‹คํ–‰๋  checkoutํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. //์ฃผ๋ฌธํ•˜๊ธฐ const checkout = () => { const oldCart =..
[myCart] ๋กœ๊ทธ์ธ ๋œ ์œ ์ €๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋…ธ์ถœํ•˜๊ธฐ
ยท
FRONTEND/React
ProductCard.jsx์— useContext๋ฅผ ์‚ฌ์šฉํ•ด์„œ userContext๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. userContext์—๋Š” ํ˜„์žฌ ๋กœ๊ทธ์ธ ์ค‘์ธ ์œ ์ €์˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๊ณ  const ProductCard = ({ product }) => { const { addToCart } = useContext(CartContext); const user = useContext(UserContext); ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฒ„ํŠผ์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์œ ์ €๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ๋…ธ์ถœํ•˜๊ฒŒ ํ•œ๋‹ค. {/* ์žฌ๊ณ ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ฐ ์œ ์ €๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ ํ‘œ์‹œ */} {product?.stock > 0 && user && ( addToCart(product, 1)} > )} 1. ์œ ์ € ์—†์„ ๊ฒฝ์šฐ 2. ์œ ์ € ์žˆ์„ ๊ฒฝ์šฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ SingleProdu..
[myCart] ProductCard ์—์„œ ๋ฐ”๋กœ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋‹ด๊ธฐ
ยท
FRONTEND/React
ProductsList.jsx๋ฅผ {/* products๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ถœ๋ ฅ */} {data.products && data.products.map((product) => ( ))} ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค. {/* products๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ถœ๋ ฅ */} {data.products && data.products.map((product) => ( ))} ProductCard.jsx์—์„œ๋Š” const ProductCard = ({ product }) => { ๋กœ ์ˆ˜์ •ํ•˜๊ณ  ์•„๋ž˜์˜ ์ถœ๋ ฅํ•  ๋ฐ์ดํ„ฐ๋“ค์˜ ์•ž์— . product?.๋ฅผ ๋ถ™์—ฌ์„œ ์ˆ˜์ •ํ•œ๋‹ค. import "./ProductCard.css"; import star from "../../assets/white-star.png"; import bas..
[myCart] ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ตฌ๋งค์ˆ˜๋Ÿ‰ ๋ณ€๊ฒฝ ๋ฐ ๋ฐฑ์—”๋“œ ์—…๋ฐ์ดํŠธ
ยท
FRONTEND/React
App.jsx์— ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ฐœ์ˆ˜ ์ฆ๊ฐ ํ•  ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค // ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ๊ฐœ์ˆ˜ ์ฆ๊ฐ( type : ๊ฐ์†Œ,์ฆ๊ฐ€ ) const updateCart = (type, id) => { const updatedCart = [...cart]; const productIndex = updatedCart.findIndex( //findIndex:update ํ•  ์ œํ’ˆ์˜ id์˜ idnex๋ฅผ ์ฐพ๋Š”๋‹ค. (item) => item.product._id === id ); //๋งŒ์•ฝ ํƒ€์ž…์ด increase ์ด๋ฉด ๊ธฐ์กด์˜ ์ˆ˜๋Ÿ‰์—์„œ ์ฆ๊ฐ€ํ•œ๋‹ค. if (type === "increase") { updatedCart[productIndex].quantity += 1; setCart(updatedCart); } //๋งŒ์•ฝ ํƒ€์ž…์ด decrease ..
ใ„ด