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

[React] React μ—μ„œ state μ‚¬μš©ν•΄λ³΄κΈ°

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

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


πŸ’œ React μ—μ„œ state μ‚¬μš©ν•΄λ³΄κΈ°

🀍 state λ₯Ό λ§Œλ“€μ–΄μ„œ 데이터 μ €μž₯해보기

  • React μ—μ„œλŠ” λ³€μˆ˜λ§κ³ λ„ state λΌλŠ” 것을 μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ €μž₯ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

  • state λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” 일단 state λ₯Ό μ‚¬μš©ν•  파일 상단에 λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό λ„£μ–΄μ£Όμ–΄μ•Ό ν•œλ‹€.
 let [value, setValue] = useState(initialValue)
  • 그리고 useState() ν•¨μˆ˜λŠ” μœ„μ™€ 같은 ν˜•νƒœλ‘œ μ‚¬μš©ν•œλ‹€.
  • useState() ν•¨μˆ˜λŠ” state λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄μ£ΌλŠ” ν•¨μˆ˜μ΄λ©°, useState() 의 μ†Œκ΄„ν˜Έ μ•ˆμ— μ €μž₯ν•  데이터λ₯Ό λ„£μœΌλ©΄ state 에 데이터λ₯Ό μ €μž₯ν•  수 μžˆλ‹€.
  • useState() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ array 의 ν˜•νƒœλ‘œ [데이터1, 데이터2] 와 같이 데이터가 두 κ°œκ°€ λ‚¨λŠ”λ°, μ΄λŠ” ꡬ쑰 λΆ„ν•΄ 문법을 ν™œμš©ν•΄μ„œ μ €μž₯ν•œ ν›„ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.
  • value λŠ” getter 에 ν•΄λ‹Ήν•˜λ©° μ‹€μ œ μ €μž₯ν•  데이터가 λ“€μ–΄μžˆλŠ” λ³€μˆ˜μ΄κ³ , setValue λŠ” setter 에 ν•΄λ‹Ήν•˜λ©° μ €μž₯ν•  데이터λ₯Ό λ³€κ²½ν•  ν•¨μˆ˜κ°€ λ“€μ–΄μžˆλŠ” λ³€μˆ˜μ΄λ‹€.

🀍 state λ°μ΄ν„°λ‘œ λ°μ΄ν„°λ°”μΈλ”©ν•˜κΈ°

function App() {

  let [title, setTitle] = useState([
      '[React] React μ„€μΉ˜μ™€ κ°œλ°œν™˜κ²½ μ…‹νŒ…ν•˜κΈ°', 
      '[React] JSX λ₯Ό μ΄μš©ν•΄ HTML νŽ˜μ΄μ§€ μ œμž‘ν•΄λ³΄κΈ°'
  ])

  return (
    <div className="App">
      <div className="veryperi-nav">
        <div>
          <FontAwesomeIcon icon={faStarAndCrescent} /> Seoyun's Blog
          </div>
      </div>
        <h2 className='intro'>λ°°μ›€μ—μ„œ κ°€μΉ˜λ₯Ό μ°ΎλŠ” μ˜ˆλΉ„ κ°œλ°œμžμž…λ‹ˆλ‹€</h2>
        <div className='list'>
          <h3>{title[0]}</h3>
          <p>2022-03-18</p>
          <hr/>
        </div>
        <div className='list'>
          <h3>{title[1]}</h3>
          <p>2022-03-18</p>
          <hr/>
        </div>
    </div>
  );
}

export default App;
  • μœ„μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ title μ΄λΌλŠ” λ³€μˆ˜μ—λŠ” [ '[React] React μ„€μΉ˜μ™€ κ°œλ°œν™˜κ²½ μ…‹νŒ…ν•˜κΈ°', '[React] JSX λ₯Ό μ΄μš©ν•΄ HTML νŽ˜μ΄μ§€ μ œμž‘ν•΄λ³΄κΈ°' ] λΌλŠ” array κ°€ μ €μž₯λœλ‹€.
  • 그리고 <h3>{title[0]}</h3> 와 같은 ν˜•νƒœλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ 데이터바인딩이 λ˜μ–΄, 미리보기 ν™”λ©΄μ—μ„œλŠ” <h3>[React] React μ„€μΉ˜μ™€ κ°œλ°œν™˜κ²½ μ…‹νŒ…ν•˜κΈ°</h3> 라고 μ½”λ“œλ₯Ό μž‘μ„±ν•œ 것과 λ˜‘κ°™μ΄ λ Œλ”λ§λ˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

  • λ˜ν•œ, state μ—λŠ” μ›μ‹œμžλ£Œν˜•λΏλ§Œ μ•„λ‹ˆλΌ Array, Object μžλ£Œν˜•μœΌλ‘œλ„ 데이터듀을 μ €μž₯ν•  수 μžˆλ‹€.

🀍 state 에 데이터λ₯Ό μ €μž₯ν•΄μ„œ μ‚¬μš©ν•˜λŠ” 이유 μ•Œμ•„λ³΄κΈ°

  • 데이터λ₯Ό μ €μž₯ν•˜λŠ” λ°©λ²•μ—λŠ” λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 방법이 μžˆλ‹€.
  • κ·Έλ ‡λ‹€λ©΄ ꡳ이 state 에 데이터λ₯Ό μ €μž₯ν•΄μ„œ μ‚¬μš©ν•  ν•„μš”κ°€ μžˆμ„κΉŒν•˜λŠ” 의문이 생길 수 μžˆλ‹€.
  • 일반적으둜 λ³€μˆ˜λŠ” 변경이 λ°œμƒν•΄λ„ μžλ™μœΌλ‘œ μž¬λ Œλ”λ§μ„ 해주지 μ•ŠλŠ”λ‹€.
  • ν•˜μ§€λ§Œ React μ—μ„œλŠ” state κ°€ μˆ˜μ •λ˜λ©΄ state κ°€ ν¬ν•¨λœ λͺ¨λ“  HTML 을 μžλ™μœΌλ‘œ μž¬λ Œλ”λ§ν•΄μ€€λ‹€λŠ” νŠΉμ„±μ΄ μžˆλ‹€.
  • λ”°λΌμ„œ, λ³€μˆ˜κ°€ 변경될 λ•Œ μžλ™μœΌλ‘œ κ΄€λ ¨λœ HTML 을 μž¬λ Œλ”λ§ν•˜λ„λ‘ λ§Œλ“€κ³  μ‹Άλ‹€λ©΄ state 에 데이터λ₯Ό μ €μž₯ν•΄μ„œ 데이터바인딩을 ν•˜λŠ” 것이 훨씬 μš©μ΄ν•˜λ‹€.

πŸ’œ React μ—μ„œ state 변경해보기

πŸ“Œ 터미널 / λΈŒλΌμš°μ € μ½˜μ†”μ°½μ— warning λ©”μ‹œμ§€ μ•ˆ λ‚˜μ˜€κ²Œ ν•˜κΈ°

  • κ°„ν˜Ή μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ‹€λ³΄λ©΄ ν„°λ―Έλ„μ΄λ‚˜ λΈŒλΌμš°μ € μ½˜μ†”μ°½μ— λ…Έλž€μƒ‰ κΈ€μ”¨λ‘œ warning λ©”μ‹œμ§€κ°€ λ‚˜μ˜€λŠ” κ²½μš°κ°€ μžˆλ‹€.
  • μ΄λŠ” eslint κ°€ 잘λͺ»λœ μ½”λ”©κ΄€μŠ΅μ„ κ΅μ •ν•΄μ£ΌλŠ” 것인데 보고 싢지 μ•Šλ‹€λ©΄ λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  μžˆλŠ” 파일의 μ΅œμƒλ‹¨μ— λ‹€μŒκ³Ό 같이 주석을 μΆ”κ°€ν•΄μ£Όλ©΄ λœλ‹€.
/* esLint-disable */

🀍 title μ˜†μ— μΆ”μ²œ λ²„νŠΌ(πŸ‘) λ§Œλ“€κΈ°

<h3>{title[0]}<span>πŸ‘</span> 0 </h3>
  • 일단 κΈ°λŠ₯을 λ§Œλ“€κΈ° 전에 μΆ”μ²œ λ²„νŠΌκ³Ό μˆ«μžκ°€ μ–΄λ–€ μ‹μœΌλ‘œ 화면에 λ‚˜μ˜€κ²Œ 할지 HTML 둜 μž‘μ„±ν•΄λ³Έλ‹€.

  • μ μš©ν•˜λ©΄ λΈŒλΌμš°μ €μ—μ„œλŠ” 이런 μ‹μœΌλ‘œ UI κ°€ 보여진닀.

🀍 μΆ”μ²œ λ²„νŠΌ(πŸ‘) 클릭 μ‹œ 숫자 μΉ΄μš΄νŠΈν•˜κΈ°

  • ν˜„μž¬ 0 μ΄λΌλŠ” 숫자둜 ν•˜λ“œμ½”λ”©μ„ ν•΄λ‘” μƒνƒœμ΄λ―€λ‘œ μΆ”μ²œ λ²„νŠΌμ„ 아무리 클릭해도 μˆ«μžλŠ” λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • λ”°λΌμ„œ, state λ₯Ό μ‚¬μš©ν•΄μ„œ μΆ”μ²œ λ²„νŠΌμ„ 클릭할 λ•Œλ§ˆλ‹€ μž¬λ Œλ”λ§ν•˜μ—¬ μΆ”μ²œ λ²„νŠΌ 클릭 수만큼 μˆ«μžκ°€ μ˜¬λΌκ°€λ„λ‘ HTML 을 λ‹€μ‹œ μž‘μ„±ν•΄μ£Όμ—ˆλ‹€.
// useState() ν•¨μˆ˜ μ‚¬μš©
let [thumbsUp, setThumbsUp] = useState(0);
  • λ¨Όμ € useState() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λͺ…을 μ •ν•œ ν›„, μ΄ˆκΈ°κ°’μ„ 0으둜 μ„€μ •ν•΄μ£Όμ—ˆλ‹€.
// JavaScript 
<div onclick="μ‹€ν–‰ν•  μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ"></div>

// React JSX
<div onClick={μ‹€ν–‰ν•  ν•¨μˆ˜}></div>


// onClick 속성에 ν•¨μˆ˜ μž‘μ„±ν•˜λŠ” 방법
// 예λ₯Ό λ“€μ–΄ ν•¨μˆ˜μ˜ 이름이 cntThumbsUp 이라고 ν•œλ‹€λ©΄ μ•„λž˜μ™€ 같이 3가지 λ°©λ²•μœΌλ‘œ μ‚¬μš© κ°€λŠ₯
<div onClick={ cntThumbsUp }></div>
<div onClick={function(){μ‹€ν–‰ν•  μ½”λ“œ}}></div>
<div onClick={()=>{μ‹€ν–‰ν•  μ½”λ“œ}}></div>
  • HTML μš”μ†Œλ₯Ό ν΄λ¦­ν–ˆμ„ λ•Œ μž‘μ„±ν•˜λŠ” μ½”λ“œλŠ” μœ„μ™€ 같이 JavaScript 와 React JSX κ°€ λΉ„μŠ·ν•˜μ§€λ§Œ 쑰금 λ‹€λ₯΄λ‹€.
    • onclick λŒ€μ‹  onClick 이라고 μž‘μ„±ν•΄μ•Ό ν•œλ‹€.
    • μŒλ”°μ˜΄ν‘œ(" ") ν˜Ήμ€ λ”°μ˜΄ν‘œ(' ') λŒ€μ‹  μ€‘κ΄„ν˜Έ({ })λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    • 일반적인 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 게 μ•„λ‹ˆλΌ ν•¨μˆ˜ ν˜•νƒœλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. 
<h3>{title[0]}<span onClick={ ()=>{ thumbsUp + 1 } }>πŸ‘</span> {thumbsUp} </h3>
  • μΆ”μ²œ λ²„νŠΌ(πŸ‘)을 클릭할 λ•Œλ§ˆλ‹€ thumbsUp 의 μˆ«μžκ°€ 1μ”© 증가해야 ν•œλ‹€.
  • κ°„λ‹¨ν•˜κ²Œ μƒκ°ν–ˆμ„ λ•Œ, thumbsUp + 1 ν•΄μ£Όλ©΄ λœλ‹€.
  • κ·Έλ ‡λ‹€κ³  ν•΄μ„œ 일반적인 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” κ²ƒμ²˜λŸΌ μœ„μ™€ 같이 μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ μ•„λ¬΄λŸ° λ°˜μ‘μ΄ μ—†λ‹€.
  • state λŠ” 일반적인 λ³€μˆ˜μ™€λŠ” 달리 값을 λ³€κ²½ν•  λ•Œ μ§€μ •λœ λ³€κ²½ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
    (λ„€! λ°”λ‘œ κ·Έκ±°μš”..값을 λ³€κ²½ν•  λ•Œ μ‚¬μš©ν•˜λ €κ³  λ‚¨κ²¨λ‘μ—ˆλ˜ setThumbsUp..)
<h3>{title[0]}<span onClick={ ()=>{ setThumbsUp(thumbsUp + 1) } }>πŸ‘</span> {thumbsUp} </h3>
  • setThumbsUp 이라고 λ§Œλ“€μ–΄ 놓은 λ³€μˆ˜κ°€ thumbsUp μ΄λΌλŠ” state λ₯Ό λ³€κ²½ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜μ— ν•΄λ‹Ήν•œλ‹€.
  • λ”°λΌμ„œ, μœ„μ™€ 같이 setThumbsUp(thumbsUp + 1) 둜 μž‘μ„±ν•˜μ—¬ 기쑴의 thumbsUp 데이터λ₯Ό λŒ€μ²΄ν•  데이터인 thumbsUp + 1 둜 λŒ€μ²΄ν•΄μ£Όλ©΄ λœλ‹€.
728x90
λ°˜μ‘ν˜•