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

[React] React μ—μ„œ 반볡문 ν™œμš©ν•˜κΈ°

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

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

  • μ΄λ•ŒκΉŒμ§€μ˜ μ‹€μŠ΅μ—μ„œλŠ” μœ„μ™€ 같이 κ²Œμ‹œκΈ€ 리슀트λ₯Ό λΈŒλΌμš°μ €μ— λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ list λΌλŠ” className 을 가진 div νƒœκ·Έλ“€μ„ 각각 ν•˜λ“œμ½”λ”©μ„ ν–ˆμ—ˆλ‹€.
  • ν•˜μ§€λ§Œ λ°μ΄ν„°μ˜ 양이 λŠ˜μ–΄λ‚ μˆ˜λ‘ ν•˜λ“œμ½”λ”©μ„ ν•˜κΈ°λ„ νž˜λ“€κ±°λ‹ˆμ™€ 파일 λ‚΄μ˜ μ½”λ“œκ°€ λ„ˆλ¬΄ κΈΈμ–΄μ Έ 가독성이 떨어진닀.
  • λ”°λΌμ„œ, λ°˜λ³΅λ¬Έμ„ ν™œμš©ν•˜μ—¬ μ½”λ“œμ˜ 길이λ₯Ό 쀄이고 ν™•μž₯성을 λ”ν•΄μ£Όμ—ˆλ‹€.

πŸ’œ map() ν•¨μˆ˜ ν™œμš©ν•˜κΈ°

  • React μ—μ„œλŠ” μ€‘κ΄„ν˜Έλ₯Ό ν™œμš©ν•˜λŠ” JSX 문법을 μ‚¬μš©ν•˜λŠ”λ°, μ€‘κ΄„ν˜Έ μ•ˆμ—λŠ” λ³€μˆ˜μ™€ ν•¨μˆ˜λ§Œ λ“€μ–΄κ°ˆ 수 있기 λ•Œλ¬Έμ— for 문을 μ§μ ‘μ μœΌλ‘œ λ„£μ–΄μ„œ μ‚¬μš©ν•  수 μ—†λ‹€.
  • ν•˜μ§€λ§Œ, array μžλ£Œν˜•μ— 뢙일 수 μžˆλŠ” map() μ΄λΌλŠ” λ‚΄μž₯ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜λ©΄ λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•œ 것과 같은 효과λ₯Ό 쀄 수 μžˆλ‹€.

🀍 map() ν•¨μˆ˜ μ•Œμ•„λ³΄κΈ°

  • map() ν•¨μˆ˜λŠ” λͺ¨λ“  array μžλ£Œν˜•μ— 뢙일 수 있으며, μ†Œκ΄„ν˜Έ μ•ˆν—€ μ½œλ°±ν•¨μˆ˜λ₯Ό λ„£λŠ” 게 κΈ°λ³Έ ꡬ성이닀.
  • 그러면 map μ•ˆμ˜ μ½”λ“œκ°€ array μžλ£Œν˜•μ˜ μžλ£Œλ“€ ν•˜λ‚˜ν•˜λ‚˜μ— 적용 및 μ‹€ν–‰λœλ‹€.
    (λ”°λΌμ„œ, μ½”λ“œλŠ” array μžλ£Œν˜•μ˜ 자료 개수만큼 λ°˜λ³΅ν•˜μ—¬ μ‹€ν–‰λœλ‹€.)
let array = [1, 2, 3, 4];

array.map(function(i){
  // λ°˜λ³΅ν•˜μ—¬ μ‹€ν–‰ν•  μ½”λ“œ
  return i * 10
});
  • μ½œλ°±ν•¨μˆ˜μ˜ μ†Œκ΄„ν˜Έ μ•ˆμ— 아무 μ΄λ¦„μ΄λ‚˜ μ •ν•΄μ„œ νŒŒλΌλ―Έν„°λ‘œ λ„£μ–΄μ£Όλ©΄, ν•΄λ‹Ή νŒŒλΌλ―Έν„°κ°€ array μ•ˆμ— 있던 λͺ¨λ“  μžλ£Œλ“€μ„ ν•˜λ‚˜μ”© 좜λ ₯ν•΄μ€€λ‹€. (λ‚˜λŠ” νŒŒλΌλ―Έν„° 이름을 i 둜 μ •ν•΄μ£Όμ—ˆλ‹€.)
  • 그러면 κ·Έ 좜λ ₯된 자료 ν•˜λ‚˜ν•˜λ‚˜μ— μ½”λ“œκ°€ 적용 및 μ‹€ν–‰λœλ‹€. (λ‚˜λŠ” * 10 을 ν•˜λΌκ³  μž‘μ„±ν•˜μ˜€λ‹€.)
  • array μ•ˆμ˜ λͺ¨λ“  자료 개수만큼 μ½”λ“œκ°€ μ‹€ν–‰λ˜κ³  λ‚˜λ©΄ 각각 10μ”© κ³±ν•΄μ Έμ„œ array λŠ” [10, 20, 30, 40] 이 λœλ‹€.
let array = [1, 2, 3, 4];

let newArray = array.map(function(i){
  // λ°˜λ³΅ν•˜μ—¬ μ‹€ν–‰ν•  μ½”λ“œ
  return i * 10
});

console.log(array); // [1, 2, 3, 4];
console.log(newArray); // [10, 20, 30, 40];
  • μ£Όμ˜ν•  점은 map() ν•¨μˆ˜κ°€ 원본 자료λ₯Ό λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹ˆλ―€λ‘œ λ³€κ²½λœ λ‚΄μš©μ΄ 적용된 array μžλ£Œν˜•μ„ μ €μž₯ν•˜μ—¬ λ‹€λ₯Έ κ³³μ—μ„œ μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ μƒˆλ‘œμš΄ λ³€μˆ˜μ— λ‹΄μ•„μ„œ μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

🀍 JSX 문법 λ‚΄μ—μ„œ 반볡문처럼 map() ν•¨μˆ˜ μ‚¬μš©ν•˜κΈ°

function App() {

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

	return (
        <div className="App">
          {
            title.map(function(content){
              return (
              <div className='list'>
                <h3>{content}</h3>
                <p>2022-03-18</p>
                <hr/>
              </div>            
              )
            })
          }
        </div>
  );
}
  • Component 의 return λ¬Έ μ•ˆμ— μžˆλŠ” νƒœκ·Έλ“€μ„ 보고 map() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 넣을 νƒœκ·Έλ“€μ΄ λ“€μ–΄κ°ˆ μœ„μΉ˜λ₯Ό 골라쀀닀.
  • μœ„μΉ˜λ₯Ό μ •ν–ˆμœΌλ©΄ μ€‘κ΄„ν˜Έλ₯Ό μ“΄ λ‹€μŒ μ€‘κ΄„ν˜Έ μ•ˆμ— map() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όλ©΄ λœλ‹€.
  • title μ΄λΌλŠ” state λŠ” array μžλ£Œν˜•μ΄λ©°, 각 자료λ₯Ό content 둜 κΊΌλ‚΄μ–΄ h3 νƒœκ·Έμ— λ„£μ–΄μ£Όμ—ˆλ‹€.
    (μΆ”μ²œ λ²„νŠΌ 뢀뢄은 κΈ°λŠ₯이 미완성이라 μ½”λ“œ μž‘μ„±μ—μ„œλŠ” μ œμ™Έν–ˆλ‹€.)

πŸ’œ for λ¬Έ ν™œμš©ν•˜κΈ°

  • map() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  for 문을 μ‚¬μš©ν•˜λŠ” 방법도 μ•Œμ•„λ‘λ©΄ μœ μš©ν•˜λ‹€.
  • React μ—μ„œ 일반적인 for 문을 μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ λ”°λ‘œ ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄μ„œ 써야 ν•˜λ©° 방법은 μ•„λž˜μ™€ κ°™λ‹€.
    • λ”°λ‘œ 일반 ν•¨μˆ˜λ₯Ό λ§Œλ“ λ‹€.
    • ν•¨μˆ˜ μ•ˆμ— νƒœκ·Έλ“€μ„ 담을 array μžλ£Œν˜•μ„ ν•˜λ‚˜ μΆ”κ°€ν•œλ‹€.
    • ν•¨μˆ˜ μ•ˆμ—μ„œ for 문을 μ΄μš©ν•΄ μΆ”κ°€ν•œ array μžλ£Œν˜•μ— νƒœκ·Έλ“€μ„ μΆ”κ°€ν•œλ‹€.
    • 반볡문이 λλ‚˜λ©΄ μ™„μ„±λœ array λ₯Ό return ν•΄μ€€λ‹€.
    • Component λ‚΄μ˜ return 문에 λ‹΄κΈ΄ νƒœκ·Έλ“€μ„ 보고 λ§Œλ“€μ–΄λ†“μ€ ν•¨μˆ˜κ°€ λ“€μ–΄κ°ˆ μœ„μΉ˜λ₯Ό 골라 { ν•¨μˆ˜λͺ…( ) } ν˜•νƒœλ‘œ 데이터바인딩을 ν•΄μ„œ λ„£μ–΄μ€€λ‹€.
function App() {

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

  function repeatTitle(title) {
    let arr = [];
    for (let i = 0; i < title.length; i++) {
    
      arr.push(
      <div className='list'>
        <h3>{title[i]}</h3>
        <p>2022-03-18</p>
        <hr/>
      </div>
      )
      
    }
    return arr;
  }

  return (
    <div className="App">
      {repeatTitle(title)}
    </div>
  );
}
  • λ‚˜μ˜ 경우 repeatTitle() μ΄λΌλŠ” μ΄λ¦„μ˜ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.
  • ν•¨μˆ˜ μ•ˆμ—λŠ” νƒœκ·Έλ“€μ„ 담을 arr λΌλŠ” μžλ£Œν˜•μ„ μΆ”κ°€ν•΄μ£Όμ—ˆλ‹€.
  • 그리고 for 문을 λ°›μ•„μ˜¨ νŒŒλΌλ―Έν„°μ˜ 길이만큼 λ°˜λ³΅ν•˜μ—¬ ν•„μš”ν•œ νƒœκ·Έλ“€μ„ push() ν•¨μˆ˜λ₯Ό 톡해 arr 에 λ‹΄μ•„μ£Όμ—ˆλ‹€.
  • h3 νƒœκ·Έμ—λŠ” νŒŒλΌλ―Έν„°λ‘œ λ“€μ–΄μ˜¨ λ°°μ—΄μ˜ μš”μ†Œλ“€μ΄ νŒŒλΌλ―Έν„°[0], νŒŒλΌλ―Έν„°[1].. 이런 μ‹μœΌλ‘œ μˆœμ„œλŒ€λ‘œ ν•˜λ‚˜μ”© λ“€μ–΄κ°€μ•Ό ν•˜λŠ”λ° νŒŒλΌλ―Έν„°μ˜ 이름이 title μ΄λ―€λ‘œ { title[i] } 둜 μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€.
  • for 문이 λλ‚œ ν›„ arr λ₯Ό return ν•΄μ£Όλ©΄ ν•¨μˆ˜λŠ” 끝이 λ‚œλ‹€.
  • 이제 μœ„μΉ˜λ₯Ό μ •ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ”λ°, λ‚˜λŠ” App μ΄λΌλŠ” className 을 가진 div νƒœκ·Έ μ•ˆμ— λ„£μ–΄μ£Όμ—ˆλ‹€.
  • 그리고 repeatTitle() ν•¨μˆ˜λŠ” title μ΄λΌλŠ” state λ₯Ό νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„μ˜¬ κ²ƒμ΄λ―€λ‘œ { repeatTitle(title) } 둜 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ—ˆλ‹€.
728x90
λ°˜μ‘ν˜•