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

[React] useEffect 과제 ν’€κΈ°

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

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

  • μ΄λ²ˆμ—λŠ” useEffect() 와 setTimeout() 을 μ‚¬μš©ν•˜μ—¬ 2μ΄ˆλ™μ•ˆλ§Œ λ³΄μ—¬μ§€λŠ” μ•Œλ¦Όμ°½μ„ λ§Œλ“€μ–΄λ³΄μ•˜λ‹€.
  • 이전에 λΆ€νŠΈμΊ ν”„λ₯Ό μˆ˜κ°•ν•  λ•Œμ—λŠ” useEffect λ‹ˆ Hook μ΄λ‹ˆ 많이 λ“€μ–΄λŠ” λ΄€λŠ”λ° μ œλŒ€λ‘œ 된 μ„€λͺ…이 μ—†μ–΄μ„œ, 이해도 ν•˜μ§€ λͺ»ν•œ μƒνƒœμ—μ„œ λ‹€μŒ μ§„λ„λ‘œ λ„˜μ–΄κ°€λŠλΌ μ°μ°ν–ˆμ—ˆλŠ”λ° 이번 기회λ₯Ό 톡해 κ°œλ…μ„ μ•Œκ³  ν™•μ‹€ν•˜κ²Œ μ–΄λ–€ λ•Œμ— μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œκ²Œ λ˜μ—ˆλ‹€.

πŸ’œ μ•Œλ¦Όμ°½ 타이머 κΈ°λŠ₯ λ§Œλ“€κΈ°

// 전체 μ½”λ“œ 미리보기
// 전체 μ½”λ“œ λ‚΄μš©μ΄ κΈΈμ–΄μ„œ λΆˆν•„μš”ν•œ 뢀뢄은 μ œμ™Έν–ˆλ‹€.

function Detail(props) {

  let [alert, setAlert] = useState(true);
  
  useEffect(()=>{
      let timer = setTimeout(()=>{setAlert(false)}, 2000);
      return ()=>{ clearTimeout(timer) };
  },[alert]);
  
  return (
    <div className="container">

      {
      alert == true 
      ? (<div className='my-alert-gold'>
         <p>
           μž¬κ³ κ°€ μ–Όλ§ˆ 남지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€. ꡬ맀λ₯Ό μ„œλ‘λ₯΄μ„Έμš”!
          </p>
        </div>) 
    : null
      }
      
    </div>
  )
}
  • useEffect() λ₯Ό ν™œμš©ν•˜μ—¬ μ•Œλ¦Όμ°½μ΄ 2초 후에 μ‚¬λΌμ§€λŠ” κΈ°λŠ₯을 λ§Œλ“€μ–΄λ³΄μ•˜λ‹€.

🀍 μ•Œλ¦Όμ°½ UI μƒνƒœλ₯Ό μ €μž₯ν•  state λ§Œλ“€κΈ°

let [alert, setAlert] = useState(true);
  • λ¨Όμ €, alert λΌλŠ” state λ₯Ό λ§Œλ“€μ–΄μ„œ μ•Œλ¦Όμ°½ UI κ°€ λ³΄μ΄κ±°λ‚˜ 보이지 μ•ŠλŠ” μƒνƒœλ₯Ό state 에 true / false 둜 μ €μž₯ν•΄μ€€λ‹€.
  • λ‚˜λŠ” λ³΄μ΄λŠ” μƒνƒœλ₯Ό true 둜 μ •ν–ˆλ‹€.

🀍 μ•Œλ¦Όμ°½ UI μƒνƒœμ— 따라 μ‹€ν–‰ν•  μ½”λ“œ μž‘μ„±ν•˜κΈ°

{
  alert == true 
  ? (<div className='my-alert-gold'>
     <p>
       μž¬κ³ κ°€ μ–Όλ§ˆ 남지 μ•Šμ•˜μŠ΅λ‹ˆλ‹€. ꡬ맀λ₯Ό μ„œλ‘λ₯΄μ„Έμš”!
      </p>
    </div>) 
  : null
}
  • state λ₯Ό λ§Œλ“€κ³  λ‚œ ν›„μ—λŠ” μ‚Όν•­ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ alert λΌλŠ” state κ°€ true 일 λ•Œ my-alert-gold λΌλŠ” class λ₯Ό 보여주고, false 일 λ•Œμ—λŠ” null μƒνƒœκ°€ λ˜λ„λ‘ ν•΄μ£Όμ—ˆλ‹€.

🀍 μ•Œλ¦Όμ°½ UI 에 타이머 κΈ°λŠ₯ μΆ”κ°€ν•˜κΈ°

  useEffect(()=>{
      let timer = setTimeout(()=>{setAlert(false)}, 2000);
  });
  • 이제 useEffect() λ₯Ό μ‚¬μš©ν•˜μ—¬ Detail Component κ°€ μƒμ„±λ˜λ©΄, μƒμ„±λ˜κ³  λ‚˜μ„œ 2초 후에 alert λΌλŠ” state κ°€ setAlert() ν•¨μˆ˜μ— μ˜ν•΄ false 둜 λ³€κ²½λ˜μ–΄ ν™”λ©΄μ—μ„œ 사라지도둝 ν•΄μ£Όμ—ˆλ‹€.
  • μ—¬κΈ°κΉŒμ§€ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ ν•œ 가지 λ¬Έμ œκ°€ μžˆλ‹€.
  • μ›λž˜ useEffect() λŠ” Component κ°€ 생성될 λ•Œλ„ μ‹€ν–‰λ˜μ§€λ§Œ, Component κ°€ update 될 λ•Œλ„ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— μ›ν•˜μ§€ μ•Šμ„ λ•Œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” κ²½μš°κ°€ 생길 수 μžˆλ‹€.

🀍 alert λΌλŠ” state κ°€ update 될 λ•Œμ—λ§Œ 타이머 κΈ°λŠ₯ μž‘λ™ν•˜λ„λ‘ λ§Œλ“€κΈ°

  useEffect(()=>{
      let timer = setTimeout(()=>{setAlert(false)}, 2000);
  },[alert]);
  • λ”°λΌμ„œ μœ„μ™€ 같이 alert λΌλŠ” state μ™Έ λ‹€λ₯Έ μš”μ†Œκ°€ update λ˜λŠ” 경우 useEffect() λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šλ„λ‘ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ£Όμ—ˆλ‹€.
  • useEffect() ν•¨μˆ˜ 맨 끝에 μžˆλŠ” λŒ€κ΄„ν˜Έμ—λŠ” state λ₯Ό 넣을 수 μžˆλŠ”λ°, 여기에 λ“€μ–΄κ°„ state κ°€ 변경될 λ•Œλ§Œ update 둜 μΈμ‹ν•œλ‹€.
  • μ΄λŠ” μΌμ’…μ˜ 싀행쑰건이며, λŒ€κ΄„ν˜Έμ— 아무 것도 μž‘μ„±ν•˜μ§€ μ•ŠμœΌλ©΄ 쑰건이 μ—†λŠ” κ²ƒμ΄λ―€λ‘œ Component κ°€ update 될 λŒ€ μ ˆλŒ€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.

🀍 버그 방지λ₯Ό μœ„ν•΄ μ‚¬μš©ν•œ νƒ€μ΄λ¨Έμ˜ 타이머 κΈ°λŠ₯ ν•΄μ œν•˜κΈ°

  useEffect(()=>{
      let timer = setTimeout(()=>{setAlert(false)}, 2000);
      return ()=>{ clearTimeout(timer) };
  },[alert]);
  • setTimeout() ν•¨μˆ˜λ‘œ 타이머 κΈ°λŠ₯을 μ‚¬μš©ν–ˆλ‹€λ©΄ μ›ν•˜μ§€ μ•ŠλŠ” 버그λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ 타이머 κΈ°λŠ₯을 ν•΄μ œν•΄μ£ΌλŠ” 것이 μ’‹λ‹€.
  • useEffect() μ•ˆμ— return κ³Ό ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•˜λ©΄ Component κ°€ μ‚¬λΌμ§ˆ λ•Œ νŠΉμ • μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.
  • λ”°λΌμ„œ return () => { clearTimeout(timer) } 라고 μ½”λ“œλ₯Ό μΆ”κ°€ν•΄μ£Όμ—ˆλ‹€.
  • cleartTimeout() 이 타이머 κΈ°λŠ₯을 ν•΄μ œν•˜λŠ” ν•¨μˆ˜μ΄κ³  μ†Œκ΄„ν˜Έ μ•ˆμ—λŠ” 타이머 이름을 적어주면 λœλ‹€. 

 

 

728x90
λ°˜μ‘ν˜•