์ค๊ฒฝ๋, ์ฐฝ์๋, ์ง์ฐ๋, ํ์๋, ๋ช ์ค๋๊ณผ ํจ๊ปํ๋ ๋์ ์ฒซ ๋ฒ์งธ ํ๋ก์ ํธ โจ
ํ๋ก์ ํธ์ ๋ฐ์ ๋จ๊ฒจ๋ ์์ ์์ ๋ด๊ฐ ์๋กญ๊ฒ ๋ฐฐ์ฐ๋ ๊ฒ๋ค์ ๋ํ ์ ๋ฆฌ (feat. ์ฐ์ฑ๋ ๋ฆฌ๋ทฐ)
โ๏ธ ๊ณต๋ฐฑ
import React, { Component } from 'react';
import ProductCard from './ProductCard/ProductCard';
import './Product.scss';
โ๏ธ import ๊ฐ์์ ๋ฐ๋ผ์, import๋ฅผ ์ข ๋ฅ๋ณ๋ก ๊ณต๋ฐฑ์ ๋ฃ์ด์ ๊ตฌ๋ถํ๋ค. ๋จ, ์ด๋ ๊ฒ ๋ช๊ฐ ์์ ๊ฒฝ์ฐ์๋ ๊ณต๋ฐฑ์์ด ๋ถ์ฌ๋ ๋ฌด๋ฐฉํ๋ค.
โ๏ธ ์คํ์ผ
โ๏ธ tag selector๋ ๋ค๋ฅธ ์์๋ค์ ์ํฅ์ ๋ฏธ์น ์ฌ์ง๊ฐ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ์ถํ ์ ์ง๋ณด์์ ์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ์คํ์ผ์ด ํ์ํ ์์์๋ className์ ๋ถ์ฌํ๋ ๊ฒ์ด ์ข๋ค.
โ๏ธ ๊ฐ์ธ์ ์ผ๋ก๋ SASS๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ฐ ์ปดํฌ๋ํธ๋ง๋ค ์ต์์์์ ์คํ์ผ์ ์ฃผ๊ธฐ ๋๋ฌธ์ nesting๋ ์์ชฝ์ ์์๋ค์๋ className์ ๋ถ์ฌํ์ง ์์๋ ๋ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ์ง๋ง ์ฐฝ์๋๊ณผ ์ด์ผ๊ธฐ ํด๋ณด๋, ์ถํ ์ปดํฌ๋ํธ๋ผ๋ฆฌ ํฉ์ณ์ง๊ณ css๋ก ์ปดํ์ผ์ด ๋์์ ๋ ๋ค์ด๋ฐ์ด ๋์ง ์์ class์ ์ํฅ์ ๋ฐ์ ์ ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
โ๏ธ addedDec์ด๋ผ๋ ์ด๋ฆ์ className์ ์ฌ์ฉํ๊ณ , ํผ๋๋ฐฑ์ ๋ฐ์๋ค. ์ฌ์ ๋ ์ถ์ฝ์ด์ ๊ฒฝ์ฐ ๊ด์ฉ์ ์ผ๋ก ๋ง์ด ์ฌ์ฉํ๋ event -> e ์ ๋๋ฅผ ์ ์ธํ๊ณ ๋ ๋ค์ด๋ฐ์ด ๋ค์ ๊ธธ์ด์ง๋๋ผ๊ณ ์ดํด๊ฐ ์ฝ๋๋ก ๋ช ํํ๊ฒ ์ ๋ฌํด์ฃผ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ๋ค.
โ๏ธ ๋๋น์ ๋์ด
โ๏ธ height๋ฅผ ๊ณ ์ ์ ์ผ๋ก ์ ํด๋ฒ๋ฆฌ๋ฉด ์ถํ ์์์์๋ค์ height๊ฐ ๋ณ๊ฒฝ๋์์๋ ์ ๋์ ์ผ๋ก ์กฐ์ ๋์ง ์๋๋ค. ์์์์๋ค์ height๋ฅผ ์์ ํด์ผ ํ ์ผ์ด ์๊ธฐ๋ฉด ๋ถ๋ชจ์์์ height๋ ๊ณ์ฐํด์ ๋ค์ ์์ ํด์ผํ๋ ๋ถ์์ฌ๊ฐ ์ผ์ด๋๋ค.
โ๏ธ ์ด๋ฌํ ๋ถ๋ถ์ ์๊ณ ์์ผ๋ฉด์๋ ์คํ์ผ์ ์ธ ๋ถ๋ถ์ ํด๋ก ํ๋ค๋ณด๋ ๋๋ ๋ชจ๋ฅด๊ฒ ๋์ด๋ฅผ ์ฃผ๊ณ ์์๋ค...ํํ
โ๏ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์์์๋ค์ height๋ฅผ ์ ํ๊ณ ๋ถ๋ชจ์์์ ํฌ๊ธฐ๋ ๊ฑฐ๊ธฐ์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ์กฐ์ ๋๊ฒ ๊ณ ์ ๊ฐ์ ์์ฃผ๋์์ผ๋ก ๋ ์ด์์์ ์ง๋ ๊ฒ์ด๋ค. (๋ณดํต ์คํฌ๋กค์ด ํ์ํ ๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ ๋ ๋ชจ๋ bottom-up ๋ฐฉ์์ผ๋ก ๋ ์ด์์์ ์์ฑํ๋ ๊ฒ์ด ์ข๋ค๊ณ ํ์ จ๋ค.)
โ๏ธ ๋ฐ์ดํฐ ์ ๋ฌ
โจ๏ธ ์ต์ด ์ฝ๋
{
"id": 1,
"backgroundColor": "none",
}
โ๏ธ ๋ฐฑ์๋์์ ์ฃผ๋ ๋ฐ์ดํฐํ์์ backgroundColor๊ฐ ์์ง ์์ ๊ฒ์ด๋ผ๋ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ์๋ค.
โ๏ธ ์ฐ๋ฆฌ ํ๋ก์ ํธ์์๋ ์ ํ ์นด๋๊ฐ ์ปดํฌ๋ํธ๋ก ๋ฐ๋ณต๋ ๋, ์นด๋์ Background ์ปฌ๋ฌ๊ฐ 9๊ฐ์ฉ ๋ฐ๋ณต๋๋ค. ์ฒ์์ ๋จ์ํ ์ ๋ฌ๋๋ ๋ฐ์ดํฐ๋ผ๊ณ ๋ง ์๊ฐํด์ Back์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ์๊ฐ์ผ๋ก Mock data๋ฅผ ๋ง๋ค์๋ค. ๊ทธ๋ฐ๋ฐ ๋ฆฌ๋ทฐ๋ฅผ ๋ฐ๊ณ ๊ณฐ๊ณฐํ ์๊ฐํด๋ณด๋ backgroundColor๋ ๋ฐ์ดํฐ๋ก ์ ์ฅํ๋ ๊ฒ ์์ฒด๊ฐ ์๋ฏธ๊ฐ ์๋ค๋ ์๊ฐ์ด ๋ค์๋ค. ๊ทธ๋์ Front ๋จ์์ ๊ด๋ฆฌํ๊ธฐ๋กํ๋ค.
โ๏ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์์๋ฐ์ดํฐ๋ก ์ ์ฅํ์ฌ ์ปดํฌ๋ํธ์ ํค ๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ฃผ๋ ๊ฒ์ด๋ค.
โ๏ธ ์ฌ๊ธฐ์ ํฌ์ธํธ๋ 9๊ฐ์ ์์์ด ๋ฐ๋ณต๋๋ค๊ณ ํด๋ ์ ํ ์นด๋๊ฐ 9๋ณด๋ค ๋ง์ ์ง๋ค๋ฉด โ๏ธ ์ด๋ผ๋ ๊ฐ์ ์ ๋ฉํ ๋๊ป์ ํด์ฃผ์
จ๋ค. ์ด ๋ถ๋ถ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ index % ์์๋ฐ์ดํฐ์ ๊ธธ์ด
๋ฅผ ํด์ฃผ๋ฉด ์ด๋ ๊ฒ ๋๋จธ์ง๋ ๊ณ์ํด์ 0~8์ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ๊ธธ์ด์ ๊ด๊ณ์์ด 9๊ฐ์ง์ ์์์ด ๋ฐ๋ณต๋๋ค๋ ๊ฒ์ด๋ค. ๋์ ์ฌ๊ณ ๋ ฅ์ผ๋ก๋ ์๊ฐํ๊ธฐ ์ด๋ ค์ ์ง๋ง...! ๋ฐฉ๋ฒ์ ์๊ณ ๋๋ ์ด๋ ๊ฒ ์ ์ฉํ๋ฉด ๋๊ฒ ๋ค!! ํ๋ ์๊ฐ์ด ๋ค์๋ค :)
โ๏ธ ํ์ฌ๋ ์์์์์์ props๋ก ๋ฐ์ ์ด ๊ฐ๋ค์ ์๋์ ๊ฐ์ด ์คํ์ผ๋ง ํ์์ง๋ง, ์ธ๋ผ์ธ ์คํ์ผ๋ง์ ์ง์ํด์ผํ๋ ์ผ์ด๊ธฐ ๋๋ฌธ์ ์ถํ์ class๋ก ๋ถ์ฌํ์ฌ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ์ฉํ ๊ฒ์ด๋ค. (ํ ์ผ ํ์ฐ...)
<li className="ProductCard" style={{ backgroundColor }}>
โจ๏ธ ์ต์ด ์ฝ๋
{this.state.productCard.map(product => {
return <ProductCard key={product.id} productCard={product} />;
})}
๐ง ๋ฆฌํฉํ ๋ง
{this.state.productCard.map(product => <ProductCard key={product.id} productCard={product} />)}
โ๏ธ arrow function ์์ ๋ฐ๋ก ๋ฆฌํด๋ง ํ ๊ฒฝ์ฐ์๋ ์์ ๊ฐ์ด ์ฆ๊ดํธ๋ return ํค์๋ ์๋ตํ ์ ์๋ค. ์์ง๋ arrow ํจ์๊ฐ ๋ฌด์์ ์ธ์๋ก ์ ๋ฌํ๋์ง ํท๊ฐ๋ ค์ syntax๋๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์๋๋ฐ, ์ด์ ์ต์ํด์ ธ์ ๊ฐํธํ๊ฒ ์ฌ์ฉํ๋ ๋ ์ด ์ค๊ธธ ์๋งํ๋ค !
โ๏ธ && ์ฐ์ฐ์
โจ๏ธ ์ต์ด ์ฝ๋
{description
? description.map(descriptionItem => {
return (
<ProductDec
key={descriptionItem.id}
description={descriptionItem.descriptionList}
/>
);
})
: null}
โ๏ธ mapํจ์๋ฅผ ์ฌ์ฉํ ๋, ๋ฐฐ์ด์ ํํ๊ฐ ์๋ ๊ฒฝ์ฐ error๊ฐ ๋ฐ์ํ๋ค. ์ด๋ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ํตํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ๋๋ฐ, ๋๋ ์ผํญ์ฐ์ฐ์๋ก ์กฐ๊ฑด์ ๋ถ์ฌํ๋๋ฐ ์ด๋ณด๋ค ๋ ์ ์ฉํ &&์ฐ์ฐ์๋ฅผ ๋ง๋ฌ๋ค..โฝ๏ธ
โ๏ธ &&์ฐ์ฐ์๋ true์ผ๋๋ง ํน์ ๊ฐ์ ๋ ๋ํ ์ ์๋๋ก ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ๋ฌด์กฐ๊ฑด true์ผ๋๋ง mapping ํด์ผํ๋ &&์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
โ๏ธ state
โ๏ธ ๋๋ state์ ๊ตณ์ด ์ํ๊ฐ ๋ณํ์ง ์๋ ๊ฐ๋ค์ ๋ํ์ฌ state์ ์ ์ฅํด๋ฒ๋ฆฌ๋ ์ด์ํ..? ์ต๊ด์ด ์๊ฒจ๋ฒ๋ ธ๋ค. ์ผ๋จ state์ ๋ค ์ ์ฅํด๋ฒ๋ฆฐ๋ค๊ณ ํด์ผํ ๊น. ๋ฐ์ดํฐ ํ๋ฆ์ ๋ํ ์ดํด๋ฅผ ๋จผ์ ํ๊ณ state๋ฅผ ํตํด ์ํ๋ฅผ ๋ณ๊ฒฝํด์ฃผ์ด์ผํ๋๋ฐ ์์ง ๊ทธ ๋ถ๋ถ์ด ํฐ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค์ง์ง ์๋๋ค. ์์ฃผ ๋ฐ๋ ํผ๋๋ฐฑ์ด์ด์ ๋ค์์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๊ฐ์ฅ ์ ์ํ์ฌ ์์ฑํ๊ณ ์ถ์ ๋ถ๋ถ์ด๋ค.
โ๏ธ ๋๋ ํ๋์ state๊ฐ์ ๊ธฐ์ค์ ๋ณํํ๋ ๊ฒ๋ค์ ๋ํ์ฌ๋ state๋ก ๋ฐ๋ก ๊ด๋ฆฌํ ํ์ ์์ด reder์์ ๋ฐ๋ก ๊ณ์ฐ ํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ข๋ค.
{addCart && <AiOutlinePlus />}
{addCart ? "์ฅ๋ฐ๊ตฌ๋ ์ถ๊ฐ๋จ" : "์ฅ๋ฐ๊ตฌ๋ ๋ด๊ธฐ"}
โ๏ธ image ํ๊ทธ
โ๏ธ img tag์ ์์ฑ์ ์ ์๋ alt๊ฐ ์ ์ผ ์๋จ์ผ๋ก ์ค๋๋ก ํด์ผํ๋ค. ์ง๊ธ๊น์ง ๋์ ์ต๊ด์ src๋ฅผ ์ ๊ณ alt๋ฅผ ์ ๋ ๊ฒ์ด์๋๋ฐ, alt๋ฅผ ๋จผ์ ์ ์ด๋ฌ๋ผ๊ณ ํ์ จ๋ค. ๊ฐ์ธ์ ์ผ๋ก ์ถ์ธกํ๊ฑด๋ฐ ์คํฌ๋ฆฐ ๋ฆฌ๋๊ธฐ์์ ์ฝํ๊ฒ ๋๋ค๋ฉด ๋จผ์ ์ฝํ์ผํ๋ ๊ฒ์ด ์ด๋ฏธ์ง์ alt์ฌ์ ๊ทธ๋ฐ๊ฒ ์๋๊น !
โ๏ธ ์ ๋นํ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ธ๊ณ... ์์งํ state, props๋ก ์ ๋ฌ๋๋ ๊ฐ ์ ๋๋ ๊ตฌ์กฐ ๋ถํด ํ๋ ค๊ณ ํ์ง map์ผ๋ก ์ ๋ฌ๋๋ ์ธ์๋ค์ ๊ตฌ์กฐ ๋ถํด ํ๋ ค๋ ์๊ฐ์ ํ ๋ฒ๋ ์ํด๋ดค๋ค..๋ ํจ์จ์ ์๊ฐํ๋ฉด์ ์ฝ๋๋ฅผ ์ง๋ ์ต๊ด์ ๋ค์ฌ์ผ๊ฒ ๋ค.
โจ๏ธ ์ต์ด ์ฝ๋
icon.map(iconItem => {
return (
<ProductIcon
key={iconItem.id}
src={iconItem.src}
alt={iconItem.alt}
/>
);
})}
๐ง ๋ฆฌํฉํ ๋ง
icon.map(({id,src,alt})=> {
return (
<ProductIcon
key={id}
src={src}
alt={alt}
/>
);
})}
โ๏ธ ์ ํํด๋ก์ง & className
โ๏ธ ์์ง๋ง๊ธฐ.. ์ต๊ด์ด ๋ฌด์ญ๋ค. ํนํ icon์ importํด์ค๋ ๊ฒฝ์ฐ ์ข ์ข ์ ํํด๋ก์ง์ ์๋๋ค. ๊ทธ๋ฆฌ๊ณ className๋..class๋ก ์ ๋ ๋งค์ง...! ๊ทธ๋๋ className์ ๊ฒฝ๊ณ ๋ผ๋ ๋จ์ง๋ง ์ ํํด๋ก์ง์ ์ก์๋ด๊ธฐ ๋๋ฌด ์ด๋ ต๋ค. ํ์ง๋ง ์ด๋ฐ ์ฝ๋๋ ์ก์๋ด๋ ์ฐ์ฑ๋ ์ต๊ณ ..๐๐ป
์์ง ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ถ๋ถ์ ๋ํ์ฌ๋ ๋ง๋ฌด๋ฆฌ๊ฐ ๋์ง ์์ ์ ๋ฆฌํ์ง ๋ชปํ์ง๋ง, ํ๋ก์ ํธ ๊ธฐ๊ฐ์ ๋ฐ์ด ์ง๋๊ณ ๋ด๊ฐ ์ด๋์ ์์ฃผ ๊ฐ์ ์ค์๋ฅผ ๋ฐ๋ณตํ๋์ง ์ด๋ค ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ฉด ํจ์จ์ ์ธ์ง์ ๋ํ์ฌ ๋์๋ณด๋ ์๊ฐ์ด์๋ค. ์ด๋ฒ ์ฃผ๋ง์ ์์ผ๋ก ๋๊ฐ๊ธฐ ์ํ ๋ฒ ์ด์ค๋ฅผ ๋ค์ง๋ ์๊ฐ์ ๊ฐ์ ธ์ผ์ง !