λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
[개발] Practice/React

[React] ν΄λ¦­ν•˜λ©΄ λ™μž‘ν•˜λŠ” UI (λͺ¨λ‹¬μ°½) λ§Œλ“€μ–΄λ³΄κΈ°

by Connecting-the-dots 2022. 3. 20.
728x90
λ°˜μ‘ν˜•

πŸ’‘ μ‹€μŠ΅ 포인트!

  • μ˜€λŠ˜μ€ ν΄λ¦­ν•˜λ©΄ λ™μž‘ν•˜λŠ” UI, κ·Έ μ€‘μ—μ„œ λͺ¨λ‹¬μ°½μ„ κ΅¬ν˜„ν•΄λ³΄μ•˜λ‹€.
  • κ°•μ˜μ—μ„œ λͺ¨λ‹¬μ°½μ„ λ””μžμΈν•΄λ†“κ³  ν΄λ¦­ν–ˆμ„ λ•Œ λͺ¨λ‹¬μ°½μ„ μ—¬λŠ” 방법을 μ•Œλ €μ£Όμ‹  ν›„, 과제둜 λ²„νŠΌμ„ ν•œ 번 더 λˆŒλ €μ„ λ•Œ λ‹«νžˆκ²Œ 해보라고 ν•˜μ…¨λ‹€.
  • λ‚˜λŠ” 였늘 ν™œμš©ν–ˆλ˜ μ‚Όν•­ μ—°μ‚°μžλ₯Ό 가지고 μ½”λ“œλ₯Ό μž‘μ„±ν–ˆκ³ , κ°•μ‚¬λ‹˜μ€ λŠλ‚Œν‘œ(!) κΈ°ν˜Έλ§Œμ„ 가지고 더 μ‰½κ²Œ λ§Œλ“œλŠ” 방법을 μ•Œλ €μ£Όμ…¨λ‹€.
  • λŠλ‚Œν‘œ(!) 기호의 μ“°μž„μ„ 잘 μ•Œκ³  μžˆλ‹€κ³  μƒκ°ν–ˆλŠ”λ°, μ•„λŠ” 것과 잘 ν™œμš©ν•˜λŠ” 것은 λ³„κ°œμ˜ λ¬Έμ œμž„μ„ λ‹€μ‹œκΈˆ κΉ¨λ‹¬μ•˜λ‹€...γ…Žγ…Ž

πŸ’œ μƒμ„ΈνŽ˜μ΄μ§€ κ²Έ λͺ¨λ‹¬μ°½ UI λ§Œλ“€κΈ°

🀍 HTML 및 CSS μ½”λ“œ μž‘μ„±ν•˜κΈ°

  • HTML
<div className="modal">
  <h2>제λͺ©</h2>
  <p>λ‚ μ§œ</p>
  <p>μƒμ„Έλ‚΄μš©</p>
</div>
  • CSS
.modal {
	margin-top: 20px;
	padding: 20px;
	background-color: #eee;
}

🀍 HTML λ₯Ό Component 둜 λ§Œλ“€κΈ°

  • μ•žμ—μ„œμ™€ 같이 html νƒœκ·Έλ“€μ„ κ·ΈλŒ€λ‘œ 넣어도 λ˜μ§€λ§Œ, React μ—μ„œλŠ” λ³΅μž‘ν•œ html νƒœκ·Έλ₯Ό ν•˜λ‚˜μ˜ λ‹¨μ–΄λ‘œ μΉ˜ν™˜ν•΄μ„œ 넣을 수 μžˆλŠ” 문법을 μ œκ³΅ν•˜κ³  μžˆλ‹€.
  • μ΄λŸ¬ν•œ 문법을 Component 라고 ν•˜λŠ”λ°, 이λ₯Ό μ΄μš©ν•˜λ©΄ ν•¨μˆ˜λ‚˜ λ³€μˆ˜λ₯Ό λ§Œλ“€ λ•Œμ²˜λŸΌ ν•˜λ‚˜μ˜ λ‹¨μ–΄λ‘œ μΉ˜ν™˜ν•΄μ„œ μ›ν•˜λŠ” μœ„μΉ˜μ— 넣어쀄 수 μžˆλ‹€.
function μ»΄ν¬λ„ŒνŠΈλͺ…(){
  return (
    <>
      <div>λ‚΄μš©1</div>
      <div>λ‚΄μš©2</div>
      <div>λ‚΄μš©3</div>
    </>
  )
}
  • Component λ₯Ό λ§Œλ“œλŠ” 방법은 λ‹€μŒκ³Ό κ°™λ‹€.
    • function 을 μ΄μš©ν•΄μ„œ ν•¨μˆ˜λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄μ€€λ‹€.
    • ν•΄λ‹Ή ν•¨μˆ˜μ˜ return() μ•ˆμ— μ›ν•˜λŠ” HTML νƒœκ·Έλ“€μ„ λ‹΄μ•„μ€€λ‹€.
    • HTML νƒœκ·Έκ°€ λ“€μ–΄κ°€μ•Ό ν•˜λŠ” μœ„μΉ˜μ— Component λͺ…을 νƒœκ·Έμ˜ ν˜•νƒœλ‘œ λ„£μ–΄μ€€λ‹€. (ex. <Modal />)
  • Component 둜 λ§Œλ“€ λ•ŒλŠ” μ£Όμ˜ν•΄μ•Όν•  점이 λͺ‡ 가지 μžˆλ‹€.
    • Component μ΄λ¦„μ˜ 첫 κΈ€μžλŠ” λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•œλ‹€.
    • return () μ•ˆμ—λŠ” ν•˜λ‚˜μ˜ div νƒœκ·Έλ‘œ λ¬Άμ–΄μ€€λ‹€.
      (의미 μ—†λŠ” div νƒœκ·Έλ₯Ό μ‚¬μš©ν•΄μ„œ λ¬Άμ–΄μ£Όκ³  싢지 μ•Šλ‹€λ©΄ <></> 둜 묢어도 λœλ‹€.)
    • Component μœ„μΉ˜λŠ” λ‹€λ₯Έ Component λ“€κ³Ό λ‚˜λž€νžˆ λ°°μΉ˜ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.
      (보톡 Component 용 function μ•ˆμ— Component 용 function 을 λ§Œλ“€μ§€λŠ” μ•ŠλŠ”λ‹€.)
function Modal(){
  return (
    <div className='modal'>
      <h2>제λͺ©</h2>
      <p>λ‚ μ§œ</p>
      <p>μƒμ„Έλ‚΄μš©</p>
    </div>
  )
}
  • 이제 기쑴에 μž‘μ„±ν–ˆλ˜ html νƒœκ·Έλ“€μ„ 가지고 Modal μ΄λΌλŠ” Component 둜 λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€. 

πŸ’œ ν΄λ¦­ν•˜λ©΄ λ™μž‘ν•˜λŠ” UI (λͺ¨λ‹¬μ°½) λ§Œλ“€μ–΄λ³΄κΈ°

🀍 μ‚Όν•­ μ—°μ‚°μž μ•Œμ•„λ³΄κΈ°

// μ‚Όν•­ μ—°μ‚°μž
쑰건식 ? 쑰건식이 참일 경우 μ‹€ν–‰ν•  μ½”λ“œ : 쑰건식이 거짓일 경우 μ‹€ν–‰ν•  μ½”λ“œ
  • 일반적으둜 νŠΉμ • 쑰건에 맞좰 HTML 을 보이게 ν˜Ήμ€ 보이지 μ•Šκ²Œ ν•˜λ €λ©΄ if 문을 μ‚¬μš©ν•˜λ©΄ λœλ‹€.
  • ν•˜μ§€λ§Œ, React 의 경우 μ€‘κ΄„ν˜Έ λ‚΄μ—μ„œ if 문을 μ‚¬μš©ν•  수 μ—†μœΌλ―€λ‘œ μœ„μ™€ 같이 μ‚Όν•­ μ—°μ‚°μžλ₯Ό ν™œμš©ν•΄μ•Ό ν•œλ‹€.

🀍 'λͺ¨λ‹¬μ°½ μ—΄κΈ°' λ²„νŠΌ κΈ°λŠ₯ λ§Œλ“€κΈ°

  • λ¨Όμ € μ½”λ“œλ₯Ό μ–΄λ–»κ²Œ ꡬ성할지 생각해본닀.
    • λ§¨μ²˜μŒμ—λŠ” λͺ¨λ‹¬μ°½ UI κ°€ 보이지 μ•Šλ„λ‘ state μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•œλ‹€.
    • state κ°€ λ°”λ€Œλ©΄ λͺ¨λ‹¬μ°½ UI λ₯Ό 보여쀀닀.
    • "λͺ¨λ‹¬μ°½ μ—΄κΈ°" λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ state κ°€ true 둜 λ°”λ€Œκ²Œ ν•œλ‹€.
let [modal, setModal] = useState(false);
  • λ¨Όμ € λͺ¨λ‹¬μ°½ UI 의 μƒνƒœμ •λ³΄λ₯Ό μ €μž₯ν•  state λ₯Ό ν•˜λ‚˜ λ§Œλ“ λ‹€.
  • 보톡 경우의 μˆ˜κ°€ 두 κ°€μ§€λ‘œ λ‚˜λ‰˜λŠ” κ²½μš°μ—λŠ” true/false λΌλŠ” μžλ£Œν˜•μ„ μ΄μš©ν•œλ‹€.
  • μ²˜μŒμ—λŠ” λͺ¨λ‹¬μ°½ UI κ°€ 보이지 μ•ŠκΈ°λ₯Ό μ›ν•˜λ―€λ‘œ state μ΄ˆκΈ°κ°’μ„ false 둜 μ„€μ •ν•΄μ£Όκ³ , state κ°€ true 둜 λ°”λ€Œλ©΄ λͺ¨λ‹¬μ°½ UI κ°€ 보이도둝 섀정해쀄 것이닀.
{modal === true ? <Modal /> : null}
  • 이제 μ‚Όν•­ μ—°μ‚°μžλ₯Ό ν™œμš©ν•΄μ„œ 쑰건문을 λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.
  • modal state κ°€ true 라면 Modal Component λ₯Ό 보여주고, false 라면 아무것도 보여주지 μ•ŠλŠ”λ‹€.
  • 참고둜 React μ—μ„œ ν……λΉˆ HTML 을 μ˜λ―Έν•˜λŠ” μ½”λ“œλŠ” null μ΄λΌλŠ” μžλ£Œν˜•μ΄λ‹€.

 

 

function App() {

  let [modal, setModal] = useState(false);

  return (
    <div>
      <button onClick={ ()=>{ setModal(true) } }>λͺ¨λ‹¬μ°½ μ—΄κΈ°</button>
      {modal === true ? <Modal /> : null}
    </div>
  );
}

 

  • 이제 μƒνƒœλ₯Ό λ³€ν™”μ‹œμΌœμ€„ 맀개체인 'λͺ¨λ‹¬μ°½ μ—΄κΈ°' λ²„νŠΌμ„ λ„£μ–΄μ£Όμ—ˆλ‹€.
  • onClick 속성을 μΆ”κ°€ν•˜μ—¬ 'λͺ¨λ‹¬μ°½ μ—΄κΈ°' λ²„νŠΌμ„ ν΄λ¦­ν–ˆμ„ λ•Œ modal 의 μƒνƒœκ°€ true κ°€ λ˜λ„λ‘ ν•΄μ£Όμ—ˆλ‹€.

🀍 λΈŒλΌμš°μ €μ—μ„œ 'λͺ¨λ‹¬μ°½ μ—΄κΈ°' λ²„νŠΌ ν΄λ¦­ν•˜μ—¬ 확인해보기

  • μž‘μ„±ν•œ μ½”λ“œλ₯Ό μ μš©ν•œ ν›„ λΈŒλΌμš°μ €μ—μ„œ 'λͺ¨λ‹¬μ°½ μ—΄κΈ°' λ²„νŠΌμ„ 클릭해보면 μœ„μ™€ 같이 λͺ¨λ‹¬μ°½μ΄ 잘 λ³΄μ΄λŠ” 것을 확인할 수 μžˆλ‹€.
  • ν•˜μ§€λ§Œ μœ„μ—μ„œ μž‘μ„±ν•œ μ½”λ“œλŠ” λͺ¨λ‹¬μ°½μ„ μ—΄ μˆ˜λŠ” μžˆμ§€λ§Œ 닫을 수 μ—†λ‹€λŠ” 단점이 μžˆλ‹€.
  • λ”°λΌμ„œ λ²„νŠΌμ„ ν•œ 번 더 ν΄λ¦­ν–ˆμ„ λ•Œ λͺ¨λ‹¬μ°½μ΄ λ‹«νž 수 μžˆκ²Œλ” μ½”λ“œ μˆ˜μ •μ΄ ν•„μš”ν•˜λ‹€.

πŸ’œ ν΄λ¦­ν•˜λ©΄ λ™μž‘ν•˜λŠ” UI (λͺ¨λ‹¬μ°½) μ—…κ·Έλ ˆμ΄λ“œν•˜κΈ°

🀍 'λͺ¨λ‹¬μ°½ μ—¬λ‹«κΈ°' λ²„νŠΌ κΈ°λŠ₯ λ§Œλ“€κΈ°

  • μ΄λ²ˆμ—λŠ” 'λͺ¨λ‹¬μ°½ μ—¬λ‹«κΈ°' 라고 λ²„νŠΌμ„ λ³€κ²½ν•œ ν›„, ν•œ 번 ν΄λ¦­ν•˜λ©΄ λͺ¨λ‹¬μ°½μ΄ 열리고 ν•œ 번 더 ν΄λ¦­ν•˜λ©΄ λͺ¨λ‹¬μ°½μ΄ λ‹«νžˆλ„λ‘ κΈ°λŠ₯을 μˆ˜μ •ν•΄λ³΄μ•˜λ‹€.
  • onClick μ†μ„±λ§Œ μˆ˜μ •μ„ ν•΄μ£Όλ©΄ λ˜λŠ” 뢀뢄이라 μ–΄λ ΅μ§€λŠ” μ•Šλ‹€κ³  μƒκ°ν–ˆλŠ”λ° κ°•μ‚¬λ‹˜μ˜ μ½”λ“œλ₯Ό λ³΄λ‹ˆ 머리λ₯Ό ν•œ λŒ€ λ§žμ€ 것 κ°™μ•˜λ‹€.
// λ‚΄κ°€ μž‘μ„±ν–ˆλ˜ μ½”λ“œ
<button onClick={ ()=>{ modal === false ? setModal(true) : setModal(false) } }>λͺ¨λ‹¬μ°½ μ—¬λ‹«κΈ°</button>
  • λ‚˜λŠ” 였늘 κ³΅λΆ€ν•œ μ‚Όν•­ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν–ˆλ‹€.
  • modal 의 true/false 여뢀에 따라 setModal(true) λ‚˜ setModal(false) λ₯Ό ν•΄μ£ΌλŠ” 1차원적인 λ°©μ‹μ΄μ—ˆλ‹€.
  • λ‹€λ§Œ μž‘μ„±ν•˜λ©΄μ„œλ„ setModal() μ΄λΌλŠ” λΆ€λΆ„μ˜ μ½”λ“œκ°€ 쀑볡이라 더 쀄일 μˆ˜λŠ” μ—†μ„κΉŒ μƒκ°ν•˜κΈ°λŠ” ν–ˆλ‹€.
// κ°•μ‚¬λ‹˜μ΄ μž‘μ„±ν•˜μ‹  μ½”λ“œ
<button onClick={ ()=>{ setModal(!modal) } }>λͺ¨λ‹¬μ°½ μ—¬λ‹«κΈ°</button>
  • κ°•μ‚¬λ‹˜μ˜ μ½”λ“œλŠ” 그런 λ‚΄ 생각을 λ‹¨λ²ˆμ— ν•΄κ²°ν•΄μ£Όμ—ˆλ‹€.
  • state 인 modal μžμ²΄κ°€ true/false 의 값을 μ €μž₯ν•˜κ³  μžˆλ‹€λŠ” 점을 ν™œμš©ν•˜μ—¬ μ•„μ˜ˆ setModal() ν•¨μˆ˜ μ•ˆμ— modal 을 λ„£μ—ˆλ‹€.
  • 그리고 false 일 λ•ŒλŠ” true 둜, true 일 λ•ŒλŠ” false 둜 λ°”λ€Œλ„λ‘ λŠλ‚Œν‘œ(!) 기호λ₯Ό 마치 ν† κΈ€ν‚€μ²˜λŸΌ ν™œμš©ν•œ 점이 μΈμƒκΉŠμ—ˆλ‹€.

🀍 λΈŒλΌμš°μ €μ—μ„œ 'λͺ¨λ‹¬μ°½ μ—¬λ‹«κΈ°' λ²„νŠΌ ν΄λ¦­ν•˜μ—¬ 확인해보기

  • 이제 μ½”λ“œλ₯Ό μ μš©ν•΄λ³΄λ©΄ λͺ¨λ‹¬μ°½ μ—¬λ‹«κΈ° λ²„νŠΌμ„ 클릭할 λ•Œλ§ˆλ‹€, λͺ¨λ‹¬μ°½ μ—¬λ‹«κΈ°κ°€ κ°€λŠ₯함을 확인할 수 μžˆλ‹€.
728x90
λ°˜μ‘ν˜•