[๐Ÿ’ป ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE 44๊ธฐ] ์†”๋กœ ํ”„๋กœ์ ํŠธ - 2 (ํ—ค๋”, ํ‘ธํ„ฐ, 4๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ ์ž‘์—…..ing)

JiEunยท2023๋…„ 5์›” 15์ผ
0

โœ”๏ธ ์‹œ์ž‘

์˜ค๋Š˜ ๋ถ€ํ„ฐ header, footer, ๊ฐ๊ฐ์˜ ์ƒํ’ˆ ์ปดํฌ๋„Œ๋“œ, ๋ชจ๋‹ฌ์ฐฝ ์ •๋„์˜ ์ž‘์—…๋งŒ ์ง„ํ–‰ํ–ˆ๋‹ค.


๐Ÿ“ ์ž‘์—… ํ˜„ํ™ฉ

header, footer๋Š” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š์•˜๋‹ค. ๊ฐ๊ฐ์˜ ์ƒํ’ˆ ์ปดํฌ๋„ŒํŠธ ์ž‘์—…ํ•˜๋Š”๊ฒŒ ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ ๊ฐ™๋‹ค.

โœ”๏ธ header

  1. ์ƒ๋‹จ ๋ฉ”๋‰ด ํ•ญ์ƒ ๋”ฐ๋ผ๋‹ค๋‹ ์ˆ˜ ์žˆ๋„๋ก position:sticky ์ฃผ๊ธฐ
  2. ํ–„๋ฒ„๊ฑฐ ๋ฉ”๋‰ด hover์‹œ ๋ฉ”๋‰ด ๋‚˜์˜ค๋„๋ก ์ž‘์—…ํ•˜๊ธฐ
    a. ๊ฐ ๋ฉ”๋‰ด ํด๋ฆญ ์‹œ ํ•ด๋‹น ํŽ˜์ด์ง€ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋„๋ก Link ์ž‘์—…ํ•ด ์ฃผ๊ธฐ

๐Ÿค” ๋ง‰ํ˜”๋˜ ๋ถ€๋ถ„

header์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์ž‘์—…์€ ๋‹ค์†Œ ๊ฐ„๋‹จํ–ˆ์ง€๋งŒ
ํ–„๋ฒ„๊ฑฐ ๋ฉ”๋‰ด ๊ตฌ์กฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ์ง€์— ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋˜ ๊ฑฐ ๊ฐ™๋‹ค.

ํ–„๋ฒ„๊ฑฐ ๋ฉ”๋‰ด๋ฅผ hoverํ•˜๋ ค๊ณ  ํ–ˆ๊ณ  ์ดˆ๋ฐ˜ ๊ตฌ์„ฑ์€ ๊ฐ๊ฐ ๋”ฐ๋กœ ์ž‘์—…ํ•ด ์ฃผ์—ˆ๋‹ค.

return(
<BurgerBtn>
	<AiOutlineMenu />          
</BurgerBtn>
<nav>
	<ul>
      <li>
          <span>OOO๋‹˜, ์•ˆ๋…•ํ•˜์„ธ์š”!</span>
      </li>
      <li>
          <Link to="/pages/Products"><AiOutlineGift className="icon" />์ƒํ’ˆ๋ฆฌ์ŠคํŠธ ํŽ˜์ด์ง€</Link>
      </li>
      <li>
          <Link to="/pages/Bookmark"><AiOutlineStar className="icon" />๋ถ๋งˆํฌ ํŽ˜์ด์ง€</Link>
      </li>
	</ul>
</nav>
)

๊ทผ๋ฐ ๊ณฐ๊ณฐํžˆ ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ hover๋ฅผ ์ฃผ๋ ค๋ฉด ๊ฐ™์ด ๋ฌถ์—ฌ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฌถ์–ด ์ฃผ๊ณ  hover๋ฅผ ๋„ฃ์–ด์ฃผ๋‹ˆ ์ž˜ ํ‘œ์‹œ ๋๋‹ค.

๋‘๋ฒˆ์งธ๋กœ ๋ง‰ํ˜”๋˜๊ฒŒ

ํ•ด๋‹น ์˜์—ญ์€ ๋ฒ„ํŠผ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์šฐ์Šค hover์‹œ ์ปค์„œ๊ฐ€ ํฌ์ธํ„ฐ๋กœ ๋‚˜์˜ค๋ฉด ์•ˆ ๋์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ <BurgerBtn>๋ผ๋Š” ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ์— ๊ฐ™์ด ๋„ฃ์–ด์ฃผ๋‹ˆ ์ „๋ถ€
์ปค์„œ๊ฐ€ ํฌ์ธํ„ฐ๋กœ ๋ณ€๊ฒฝ ๋˜์–ด์žˆ์—ˆ๋‹ค. ์ด๊ฑด ๋‹คํ–‰ํžˆ ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  ๋ฉ”๋‰ด์™€ ๋™์ผํ•˜๊ฒŒ ๊ฐ€์ ธ์˜จ ๊ฑฐ ๊ฐ™์•„ ํ•ด๋‹น ์Šคํƒ€์ผ์„ ๋ถ„์„ํ•ด ์ˆ˜์ •ํ•ด ์ฃผ์—ˆ๋‹ค.

<BurgerBtn>๋ผ๋Š” ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ์—๋Š” cursor:pointer๋ฅผ ์ฃผ๊ณ 
<nav>์ธ ๋ฉ”๋‰ด ์˜์—ญ์€ cursor:auto๋กœ ๋ณ€๊ฒฝํ•ด ํ•ด๊ฒฐํ•ด ์ฃผ์—ˆ๋‹ค!

๊ทธ๋ ‡๊ฒŒ ์™„์„ฑ๋œ header


footer์˜ ๊ฒฝ์šฐ๋Š” ๊ฐ„๋‹จํ•ด์„œ ๊ธˆ๋ฐฉ ๋๋‚ฌ๋‹ค.

๋Œ€์‹  ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋ฐฉ์นจ, ์ด์šฉ ์•ฝ๊ด€์˜ ๊ฒฝ์šฐ ํ”ผ๊ทธ๋งˆ๋‚˜ ์š”๊ตฌ์‚ฌํ•ญ์— ์ ํ˜€ ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ ๊ฑฐ์˜ ๋ฉ”๋‰ด๋กœ ์•Œ๊ณ  ์žˆ์–ด

p, div, span ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ a ํƒœ๊ทธ๋กœ ์ž‘์—…ํ•ด ์ฃผ์—ˆ๋‹ค.

โœ”๏ธ main list, modal, ๊ฐ ์ƒํ’ˆ ์Šคํƒ€์ผ๋ง

header, footer๋Š” ํ•ญ์ƒ ๋”ฐ๋ผ ๋‹ค๋‹ˆ๋Š” ์˜์—ญ์ด๋‹ค.
์ด์ œ ์ค‘๊ฐ„์— ๋“ค์–ด๊ฐˆ ์ปจํ…์ธ ๋ฅผ ์ž‘์—…ํ•ด ์ฃผ์—ˆ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ์€

  1. 4์—ด๋กœ ๋ฐฐ์น˜ (ํƒ€์ž…์€ ์ด 4๊ฐ€์ง€๋กœ ๋ณด์—ฌ์ฃผ๋Š” ๋‚ด์šฉ์ด ๋‹ค๋ฅด๋‹ค.)
    a.๊ฐ ํƒ€์ž…์— ๋งž์ถฐ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ํ›„ ์ž‘์—…ํ•ด ์ฃผ๊ธฐ
  2. ์ƒํ’ˆ ํด๋ฆญ ์‹œ ๋ชจ๋‹ฌ ์ฐฝ ๋„์šฐ๊ธฐ
    a.๋ชจ๋‹ฌ์ฐฝ์—๋Š” ๋‹ซ๊ธฐ๋ฒ„ํŠผ, ์ƒํ’ˆ๋ช…,๋ถ๋งˆํฌ ๋ฒ„ํŠผ์ด ์žˆ์–ด์•ผํ•œ๋‹ค.
  3. ๋ถ๋งˆํฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ถ๋งˆํฌ ๋ฆฌ์ŠคํŠธ๋กœ ์ด๋™ ๋ฐ ๋ฒ„ํŠผ ์Šคํƒ€์ผ ๋ณ€๊ฒฝ
    a.๋ถ๋งˆํฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ† ์ŠคํŠธ ์ฐฝ์ด ๋‚˜์™€์•ผํ•œ๋‹ค.

์‚ฌ์‹ค main list๋„ ๊ทธ๋ ‡๊ณ  ์ƒํ’ˆ๋ฆฌ์ŠคํŠธ, ๋ถ๋งˆํฌ๋ฆฌ์ŠคํŠธ๋„
์ƒํ’ˆ 4๊ฐœ์˜ ํƒ€์ž…๋งŒ ์ž˜ ์ž‘์—…ํ•ด ์ฃผ๋ฉด ๋‚˜๋จธ์ง€๋Š” ๋ณด์—ฌ์ฃผ๊ธฐ๋งŒ ํ•˜๋Š”๊ฑฐ๋ผ ์˜ค๋ž˜๊ฑธ๋ฆฌ์ง€ ์•Š์„ ๋“ฏ ์‹ถ๋‹ค.

๋˜ํ•œ main list์— ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ค„๋ ค๋ฉด ๊ฒฐ๊ตญ ์ƒํ’ˆ 4๊ฐœ๋ฅผ ์ž‘์—…ํ•ด ์ฃผ์–ด์•ผํ•œ๋‹ค.

์•„๋งˆ ์ด๋ถ€๋ถ„์—์„œ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.


์šฐ์„  ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ๊ฐ์˜ ํƒ€์ž…์„ ๋งŒ๋“ค์–ด ์ฃผ๊ณ 

<CardItem>์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด 4๊ฐœ์˜ ์ƒํ’ˆ์„ ๊ด€๋ฆฌํ•˜๊ณ 
map๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ•˜๋‚˜์”ฉ ๋ณด์ด๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

์—ฌ๊ธฐ ๊นŒ์ง€๋Š” ์ˆ˜์›”ํ–ˆ๋˜ ๊ฑฐ ๊ฐ™๋‹ค...

๐Ÿค” ๋ง‰ํ˜”๋˜ ๋ถ€๋ถ„

์ฒซ๋ฒˆ์งธ

๊ฐ type๋งˆ๋‹ค ์ด๋ฏธ์ง€, ์ด๋ฆ„ ๋“ฑ์„ ๋ณด์—ฌ์ค€๋‹ค.

๋”๋ฏธ ๋ฐ์ดํ„ฐ์— image_url๊ฐ€ ์žˆ์–ด์„œ "์•„ ์ด๊ฒŒ ์ด๋ฏธ์ง€ ์ฃผ์†Œ๊ตฌ๋‚˜"ํ•˜๊ณ  ์—ฐ๊ฒฐ์„ ํ–ˆ๋”๋‹ˆ type์ด Brand์ธ ๊ฒฝ์šฐ๋Š” ์—‘๋ฐ•์ด ๋–ด๋‹ค.

์•Œ๊ณ ๋ณด๋‹ˆ Brand๋Š” brand_image_url๋ผ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ–ˆ๋‹ค. ์ด๋ถ€๋ถ„์€ ํŽ˜์–ด๋ถ„์˜ ๋„์›€์œผ๋กœ ํžŒํŠธ๋ฅผ ์–ป์–ด ํ•ด๊ฒฐํ–ˆ๋‹ค.

<img
	src={dummyData.type === "Brand" ? dummyData.brand_image_url : dummyData.image_url}
	alt={dummyData.type === "Brand" ? dummyData.brand_name : dummyData.title}
/>

์กฐ๊ฑด๋ฌธ dummyData.type === "Brand"์œผ๋กœ ์ฃผ์–ด
type์ด "Brand"๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ์™€ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด ์ฃผ์—ˆ๋‹ค.

๋‘๋ฒˆ์งธ


Product, Category, Exhibition, Brand ์ด 4๊ฐ€์ง€ ํƒ€์ž…์ด ์žˆ๋‹ค.

Product, Brand์€ ๊ฐ๊ฐ ํ• ์ธ์œจ, ๊ด€์‹ฌ๊ณ ๊ฐ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€๋Š”๋ฐ
Category, Exhibition ๋‘ ๊ฐœ๋Š” ํ•ด๋‹น ๋‚ด์šฉ์ด ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

if๋ฌธ์œผ๋กœ ํ• ๊นŒ ํ–ˆ์ง€๋งŒ ์ƒ๊ฐ๋Œ€๋กœ ๋˜์ง€ ์•Š์•„ ๊ฐ๊ฐ ๋”ฐ๋กœ ์‚ผํ•ญ ์—ฐ์‚ฐ์ž๋ฅผ ์ค˜์„œ ์ž‘์—…ํ–ˆ๋‹ค.

<div className="right-area">
	{/* Category, Exhibition */}
	{!dummyData.discountPercentage && null}
  
	{/* Brand */}
	{dummyData.type !== "Brand" || <strong>๊ด€์‹ฌ๊ณ ๊ฐ์ˆ˜</strong>}
  
	{/* Product*/}
	{dummyData.type !== "Product" || 
    <strong className="product">
    {`${dummyData.discountPercentage}%`}</strong>}
  
	<span>{!dummyData.price ? priceComma(dummyData.follower) : priceComma(dummyData.price)}</span>
</div>
  1. Category, Exhibition ๋ถ€ํ„ฐ
  • discountPercentage์ด ์—†๋‹ค๋ฉด null๋กœ ํ‘œ์‹œํ–ˆ๋‹ค.
  1. Brand, Product์€
  • ๋น„์Šทํ•œ ์กฐ๊ฑด์œผ๋กœ ๋งŒ๋“ค์–ด ์ž‘์—…ํ•ด ์ฃผ์—ˆ๋‹ค.

์‚ผํ•ญ์—ฐ์‚ฐ์ž๋Š” if๋ฌธ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ ์„ ์ด์šฉํ–ˆ๋‹ค.

โœ”๏ธ ๋ชจ๋‹ฌ์ฐฝ ๊ตฌํ˜„

const [isModal, setIsModal] = useState(false)

const showModal = () => {
	setIsModal(!isModal)
}
.
.
.
<div className="img-box" onClick={showModal}>
	<img
	src={dummyData.type === "Brand" ? dummyData.brand_image_url : dummyData.image_url}
	alt={dummyData.type === "Brand" ? dummyData.brand_name : dummyData.title}/>
	<BookMark />
</div>


๋ชจ๋‹ฌ์ฐฝ์€ useState() ์‚ฌ์šฉํ•ด ์กฐ๊ฑด๋ฌธ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด ์ฃผ์—ˆ๋‹ค.
๋ชจ๋‹ฌ ์ฐฝ์€ ๋‹ค์†Œ ๊ฐ„๋‹จํ–ˆ๋˜๊ฑฐ ๊ฐ™๋‹ค.

์•„์ง ์ „๋ถ€ ๊ตฌํ˜„ํ•œ๊ฑด ์•„๋‹ˆ๋ผ ํ•˜๋‹จ ์ขŒ์ธก์ด๋‚˜ ๋ถ๋งˆํฌ ๋ฒ„ํŠผ ์ด ๋‚จ์•„ ์žˆ๋‹ค.
.
.
.
๊ทธ๋ ‡๊ฒŒ ์ˆ˜์ •๋œ (๊ณ„์† ์ž‘์—… ์ค‘)

๐Ÿ› ๏ธ ํŽ˜์–ด๋ถ„๊ณผ ์ฝ”๋“œ ๋ฆฌ๋ทฐ

ํŽ˜์–ด ๋ถ„๊ณผ ๊ฐ™์ด ๊ทธ๋™์•ˆ ํ•œ ์ž‘์—…๋ฌผ์€ git์— PRํ•ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.


โœ๏ธ ๋งˆ์น˜๋ฉฐ

์†”๋กœ ํ”„๋กœ์ ํŠธ๋Š” ์ฒ˜์Œ ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ์Šค์Šค๋กœ ์ง„ํ–‰ ํ•˜๋Š” ๊ฑฐ๋ผ ์ •๋‹ต์€ ์—†๋Š”๊ฑฐ ๊ฐ™๋‹ค.

์ด๋ฒˆ ๊ธฐํšŒ๋กœ git ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ branch๋ฅผ ์ƒ์„ฑํ•ด ๋ฐ”๋กœ main์— pushํ•˜์ง€ ์•Š๊ณ 
prํ›„ ํ™•์ • ๋  ๋•Œ main์œผ๋กœ mergeํ•ด ์ฃผ๋Š” ์—ฐ์Šตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ์˜€๋‹ค.

๋˜ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ชผ๊ฐœ์•ผํ• ์ง€ ๊ตฌ์กฐ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌ์ƒํ•ด์•ผํ–ˆ์ง€๋Š” ๊ณ ๋ฏผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋œป ๊นŠ์€ ์‹œ๊ฐ„์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

profile
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์„ฑ์žฅ ์ค‘! (์•Œ์•„๋ดค๋˜ ๋‚ด์šฉ ๋“ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ)

0๊ฐœ์˜ ๋Œ“๊ธ€