Section3 Unit4 [React] ์ํ ๊ด๋ฆฌ
๐ Chapter1. ์ํ ๊ด๋ฆฌ
• ์ํ๋, UI์ ๋์ ์ผ๋ก ํํ๋ ๋ฐ์ดํฐ
• ๋ก์ปฌ ์ํ๋ ํน์ ์ปดํฌ๋ํธ ์์์๋ง ๊ด๋ฆฌ๋๋ ์ํ๋ก ๋ณดํต ์ปดํฌ๋ํธ ๋ด์์๋ง ์ํฅ์ ๋ผ์น๋ค. ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ง ์๋ ํผ(form) ๋ฐ์ดํฐ๋ ๋๋ถ๋ถ ๋ก์ปฌ ์ํ๋ก input box, select box ๋ฑ๊ณผ ๊ฐ์ด ์ ๋ ฅ๊ฐ์ ๋ฐ๋ ๊ฒฝ์ฐ๊ฐ ์ด์ ํด๋นํ๋ค.
• ์ ์ญ ์ํ๋ ํ๋ก๋ํธ ์ ์ฒด ํน์ ์ฌ๋ฌ ๊ฐ์ง ์ปดํฌ๋ํธ๊ฐ ๋์์ ๊ด๋ฆฌํ๋ ์ํ๋ก ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ์ํ๋ฅผ ๋ค๋ฃฌ๋ค๋ฉด, ์ด ์ถ์ฒ๋ ์ค์ง ํ ๊ณณ์ด์ด์ผ ํ๋ค. ๋ง์ฝ ์ฌ๋ณธ์ด ์๋ค๋ฉด, ๋ ๋ฐ์ดํฐ๋ ์๋ก ๋๊ธฐํ ๋์ด์ผ ํ๋๋ฐ ์ด๋ ๋ฌธ์ ๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ ๋ค. ๋ฐ๋ผ์ ํ ๊ณณ์์๋ง ์ํ๋ฅผ ์ ์ฅํ๊ณ ์ ๊ทผํ๋ ๊ฒ์ด ์ค์ํ๋ค.
→ ์ ์ญ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ง์ด ์ฌ์ฉ๋๋ ํด๋ก๋ React Context, Redux ๋ฑ์ด ์๋ค.
→ ์ํ ๊ด๋ฆฌ ํด์ ์ ์ญ ์ํ๋ฅผ ์ํ ์ ์ฅ์๋ฅผ ์ ๊ณตํ๊ณ , props drilling์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ด์ ์ด ์๋ค.
๐ npm trends๋ฅผ ๋ณด๋ฉด, redux๊ฐ ์ฌ์ ํ ์๋์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋จ์ ์ ์ ์๋ค.
๐ Chapter2. Props Drilling
Props Drilling๊ณผ ์ํ๊ด๋ฆฌ์ ๋ํ ๋ด์ฉ์ ๋ฐ๋ก ์ ๋ฆฌ๋ฅผ ํด๋ณด์๋ค.
โญ๏ธ ๊ณผ์ . Cmarket Hooks
โ๏ธ Bare Minimum Requirement
โ react-router-dom์ ์ด์ฉํด Client Side Routingํ๋ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
โ useState๋ฅผ ์ด์ฉํด ์ํ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ํ์ตํฉ๋๋ค.
• ์ผํ๋ชฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์ธ์.
โ [์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ] ๋ฒํผ์ ์ด์ฉํด ์ฅ๋ฐ๊ตฌ๋์ ํด๋น ์ํ์ด ์ถ๊ฐ๋๋๋ก ๊ตฌํํ์ธ์.
โ ์ฅ๋ฐ๊ตฌ๋ ๋ด [์ญ์ ] ๋ฒํผ์ ์ด์ฉํด ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ด ์ ๊ฑฐ๋๋๋ก ๊ตฌํํ์ธ์.
โ ์ฅ๋ฐ๊ตฌ๋ ๋ด์์ ๊ฐ ์์ดํ ๊ฐ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ๊ตฌํํ์ธ์.
โ ์ฅ๋ฐ๊ตฌ๋์ ์ํ ๊ฐ์์ ๋ณ๋์ด ์๊ธธ ๋๋ง๋ค, ์๋จ ๋ด๋น๊ฒ์ด์ ๋ฐ์ ์ํ ๊ฐ์๊ฐ ์ ๋ฐ์ดํธ๋๋๋ก ๊ตฌํํ์ธ์.
โ๏ธ ๊ณผ์ ๊ตฌํ ์ฝ๋
๋ด๊ฐ ์์ฑํ๋ ์ฝ๋์ ๋ผ์ด๋ธ ์ธ์ ์์ ์์ฑํ๋ ์ฝ๋๊ฐ ์ฝ๊ฐ์ฉ์ ๋ฌ๋๋ค. ๊ฒฐ๊ตญ์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ฒ์ด์์ง๋ง, ์ฌ๋ฌ ๋ฐฉ์์ผ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋ค์ํ ๋ฐฉ๋ฒ์ ์๊ฒ ๋์ด์ ์ข์๋ค.
์๋ ์ฝ๋๋ ๋ด๊ฐ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ๋ง ๋ค์ ์ ๋ฆฌํด๋ณด์๋ค. ๊ฐ์ฅ ์ด๋ ค์ ๋ ๋ถ๋ถ์ handleQuantityChange ์๋๋ฐ, quantity๋ฅผ ์ด๋ป๊ฒ ๋ฐ๊พธ์ด์ผ ํ๋์ง ๊ณ์ ๊ณ ๋ฏผ์ ํ์๋ ๊ฒ ๊ฐ๋ค.
Redux์ ๋ค์ด๊ฐ๊ธฐ ์ ์ Props๋ก ์ํ๋ฅผ ์ ๋ฌํ๋ ๋ถํธํจ์ ๋๊ปด๋ณผ ์ ์๋ ๊ณผ์ ์๋ค. ๐
๐ฉ๐ป๐ป handleClick
const handleClick = (e, id) => {
const addItem = items.filter((item) => item.id === id)
console.log("addItem", addItem);
// 1. ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ
// some: ํด๋น ๋ฐฐ์ด์ ๋ชจ๋ ์์์ ๋ํ์ฌ ๋ฐ๋ณต์ ์ผ๋ก ๋ช
์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ ํ, ๊ทธ ๊ฒฐ๊ด๊ฐ์ด ํ๋๋ผ๋ true์ด๋ฉด true๋ฅผ ๋ฐํ
/*
if ( !cartItems.some((item) => item.itemId === addItem[0].id) ) {
setCartItems((prev) => [...prev, {
itemId: id,
quantity: 1
}])
setCount((prev) => prev + 1)
}
*/
// 2. ๋๋ฒ์งธ ๋ฐฉ๋ฒ
// findIndex: ์ ๋ฌ๋ฐ์ ํจ์๋ฅผ ๋ง์กฑํ๋ ๋ฐฐ์ด ์์์ ์ฒซ๋ฒ์งธ ์์์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํ. ๋ง์กฑํ๋ ๊ฐ์ด ์์ผ๋ฉด -1์ ๋ฐํ.
const idx = cartItems.findIndex((item) => item.itemId === id)
// ์ฅ๋ฐ๊ตฌ๋์ ์์ดํ
์ด ์๋ ๊ฒฝ์ฐ(idx === -1) ์์ดํ
์ถ๊ฐ
// ์ฅ๋ฐ๊ตฌ๋์ ์์ดํ
์ด ์ด๋ฏธ ๋ค์ด์๋ ๊ฒฝ์ฐ(idx !== -1) quantity ์ถ๊ฐ
if (idx === -1) {
setCartItems((prev) => [...prev, {
itemId: addItem[0].id,
quantity: 1
}])
setCount((prev) => prev + 1)
} else {
setCartItems([...cartItems]);
cartItems[idx].quantity += 1
}
// 3. ๋จ, ์๋์ ๊ฐ์ด ์์ฑํ๋ ๊ฒ์ X
// ๋ฆฌ์กํธ์์ ์ํ(state)๋ฅผ ๋ณ๊ฒฝํ ๋๋ ์ํ๋ฅผ ์ง์ ์์ ํ๊ฑฐ๋ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์๋๋ค.
// push๋ฅผ ์ฌ์ฉํด ์์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ํด๋น ๋ฐฐ์ด์ ์ํ๋ฅผ ์ง์ ๋ณ๊ฒฝํ๋ฏ๋ก ๊ถ์ฅ๋์ง ์์
/*
if ( !cartItems.some((item) => item.itemId === addItem[0].id) ) {
cartItems.push( {'itemId': id, 'quantity' : 1} );
setCartItems(cartItems);
setCount((prev) => prev + 1);
}
*/
}
๐ฉ๐ป๐ป handleQuantityChange, handleDelete
const handleQuantityChange = (quantity, itemId) => {
// console.log(quantity, itemId)
// ๋ด๊ฐ ์ด ์ฝ๋
/*
const updatedItems = [...cartItems];
const idx = cartItems.findIndex((item) => item.itemId === itemId);
updatedItems[idx].quantity = quantity;
setCartItems(updatedItems)
*/
// ๋ผ์ด๋ธ์ธ์
์ฝ๋
setCartItems((oldItem) =>
oldItem.map((item) => (item.itemId === itemId ? { ...item, quantity } : item))
)
}
const handleDelete = (itemId) => {
// ๋ด๊ฐ ์ด ์ฝ๋
setCartItems( cartItems.filter((item) => item.itemId !== itemId) )
// ๋ผ์ด๋ธ์ธ์
์ฝ๋
// reduce๋ฅผ ์ฌ์ฉํด์ delete ์์
์ ์ํํ ์๋ ์๋ค!
/*
setCartItems((oldItem) => (
oldItem.reduce((acc, item) => {
// console.log("acc", acc, "item", item)
return item.itemId === itemId ? acc : acc.concat([item])
}, [])
))
*/
setCheckedItems(checkedItems.filter((el) => el !== itemId))
setCount((prev) => prev - 1)
}
๐ ์ค๋์ ํ๊ณ
์๊ฐ์ด ์์ด๋ ๊ฒ ๋น ๋ฅธ์ง ๋ฒ์จ Redux๋ฅผ ํ์ตํ๋ ์ ๋๊น์ง ์๋ค. ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ฆฌ๋์ค๋ฅผ ํ์ตํ๊ธฐ ์ ์ ๋ฆฌ๋์ค๊ฐ ์ ํ์ํ์ง, Props Drilling์ด ์ผ๋ง๋ ๋ถํธํ์ง์ ๋ํด ์ค์ตํ๋ ์๊ฐ์ ๊ฐ์ก๋ค. ๋ฆฌ๋์ค ๋ฌธ๋ฒ์ด ์ต์ํ์ง ์๊ธฐ๋ ํ์ง๋ง, ์ด๋ฒ์ Cmarket ๊ณผ์ ๋ฅผ ํ๋ฉฐ state์ ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด props๋ก ์ฌ๋ฌ๋ฒ ์ ๋ฌ์ ํ๋๋ฐ์ ๋ถํธํจ์ ๋ง์ด ๋๊ผ๊ธฐ ๋๋ฌธ์ (์ด์ ์๋ ๋ฆฌ์กํธ๋ฅผ ๊ณต๋ถํ๋ฉฐ props๋ฅผ ์ฌ๋ฌ ์ฐจ๋ก ์ ๋ฌํ๋ ๊ณผ์ ์์ ๋ถํธํจ์ ๋๋ผ๊ณค ํ๋ค.) ๋ฆฌ๋์ค๊ฐ ์ด ๋ถํธํจ์ ํด์์์ผ์ค ์ ์๊ธฐ๋ฅผ ๊ธฐ๋ํ๋ ์ค์ด๋ค..!
๋ฆฌ๋์ค๋ ์ด๋จ๊น?! ๊ถ๊ธํ๋๊น ์ผ๋ฅธ ๊ณต๋ถ๋ฅผ ํ๋ฌ ๊ฐ๋ด์ผ๊ฒ ๋ค! ๐