[React] useEffect()

chxxrinยท2024๋…„ 4์›” 1์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
28/32
๐ŸŽค mount, update์‹œ ์ฝ”๋“œ ์‹คํ–‰ํ•ด์ฃผ๋Š” useEffect() ๐ŸŽค ์ฒ˜์Œ์‹คํ–‰์‹œ, ์—…๋ฐ์ดํŠธ์‹œ ์ฝ”๋“œ ์‹คํ–‰ํ•ด์ฃผ๋Š” useEffect()

1. useEffect import ํ•ด์˜ค๊ธฐ

import { useEffect, useState } from "react";

2. useState ์‚ฌ์šฉ

let [count, setCount] = useState(0)

3. useEffect ์‚ฌ์šฉ

(์•„๋ž˜์—์„œ ์‚ฌ์šฉํ•œ console.log ์˜ˆ์‹œ๋Š” ๊ทธ๋ƒฅ ๋…๋ฆฝ์ ์ธ ๊ฑฐ๋กœ ์‚ฌ์šฉ๋จ)

useEffect(()=>{
    console.log('์•ˆ๋…•')
  })

4. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ˆซ์ž๊ฐ€ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€ํ•˜๊ณ , console ์ฐฝ์—๋„ ์•ˆ๋…•์ด ํ•œ ๋ฒˆ์”ฉ ์ฆ๊ฐ€ํ•œ๋‹ค

{count} -> ์ˆซ์ž๊ฐ€ ์ฆ๊ฐ€
<button onClick={()=>{ setCount(count+1) }}>๋ฒ„ํŠผ</button>

Q. useEffect ๋ฐ”๊นฅ์— ๋„ฃ์–ด๋„ ๋˜‘๊ฐ™์€๋ฐ?

โ†’ ๋“คํ‚ด..

useEffect ์“ฐ๋Š” ์ด์œ 

๐ŸŽค useEffect ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๋Š” **html ๋ Œ๋”๋ง ํ›„**์— ๋™์ž‘ํ•œ๋‹ค

โ†’ html์„ ๋จผ์ € ๋ณด์—ฌ์ค€ ๋‹ค์Œ ์–ด๋ ค์šด ์ฝ”๋“œ๋ฅผ ๊ทธ ๋‹ค์Œ์— ์‹คํ–‰ํ•˜๋ฏ€๋กœ html์ด ๋นจ๋ฆฌ ๋ณด์ธ๋‹น!

useEffect ์•ˆ์— ์ ๋Š” ์ฝ”๋“œ๋“ค์€ ์ฃผ๋กœ ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ์ž‘์—…, html๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ ๋ณด๋‹ค๋Š” ๋œ ์ค‘์š”ํ•œ ๊ฒƒ๋“ค

  1. ์–ด๋ ค์šด ์—ฐ์‚ฐ
  2. ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…
  3. ํƒ€์ด๋จธ ์žฅ์ฐฉํ•˜๋Š”๊ฑฐ

โ‡’ HTML ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋œ ์ค‘์š”ํ•œ ๊ฑฐ๋ผ์„œ ๋‚˜์ค‘์— ๋ณด์—ฌ์ค˜๋„ ๋จ

Q. ์™œ ์ด๋ฆ„์ด Effect ์–ด์ฉŒ๊ตฌ์ž„?

Side Effect : ํ•จ์ˆ˜์˜ ํ•ต์‹ฌ๊ธฐ๋Šฅ๊ณผ ์ƒ๊ด€์—†๋Š” ๋ถ€๊ฐ€๊ธฐ๋Šฅ

โ†’ ์—ฌ๊ธฐ์„œ ๋”ฐ์˜จ ์ด๋ฆ„

โ†’ useEffect์— ๋“ค์–ด๊ฐˆ ์ฝ”๋“œ๋“ค์€ side effect ์ฝ”๋“œ ๋ณด๊ด€ํ•จ์ด๊ธฐ ๋•Œ๋ฌธ!

โ†’ main ๊ธฐ๋Šฅ, ํ•ต์‹ฌ๊ธฐ๋Šฅ, ๋žœ๋”๋ง๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๋ผ ๋ถ€๊ฐ€๊ธฐ๋Šฅ

Q. Detail ํŽ˜์ด์ง€ ๋ฐฉ๋ฌธ ํ›„ 2์ดˆ ์ง€๋‚˜๋ฉด
์ˆจ๊ธฐ๊ธฐ

  1. state๋ณ€์ˆ˜, state๋ณ€๊ฒฝํ•จ์ˆ˜, state์ดˆ๊ธฐ๊ฐ’ ์„ค์ • โ‡’ true๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•จ
let [alert, setAlert] = useState(**true**)
  1. useEffect์•ˆ์— setTimeout ์„ค์ • โ‡’ ๋ณด์—ฌ์ฃผ๋Š”๊ฒŒ true์ด๋ฏ€๋กœ ์•ˆ๋ณด์—ฌ์ฃผ๋Š”๊ฑด false๋กœ ์„ค์ •ํ•˜๋ฉด ๋จ
useEffect(()=>{
        setTimeout(()=>{setAlert(**false**)}, 2000)
    }, [])
  1. ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•ด์„œ state๋ณ€์ˆ˜๊ฐ€ true๋ฉด html ๋ณด์—ฌ์ฃผ๊ณ , false๋ฉด ๋ณด์—ฌ์ฃผ์ง€๋ง์ž
{
        alert == true
        ? <div className="alert alert-warning">
            2์ดˆ ์ด๋‚ด ๊ตฌ๋งค์‹œ ํ• ์ธ
          </div>
        : null 
      }

โ†’ ์‚ผํ•ญ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ

useEffect ์‹คํ–‰์กฐ๊ฑด ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ [ ]

dependency

useEffect(()=>{
    setTimeout(()=>{ setAlert(false) },2000)
  }, **[]**)
useEffect(()=>{
    setTimeout(()=>{ setAlert(false) },2000)
  }, **[count]**)

โ†’ [count]๊ฐ€ ์—†์„ ๋•Œ๋Š” ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ mount, update๋  ๋•Œ๋งˆ๋‹ค ์ด ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

โ†’ ๊ทผ๋ฐ ์ด ๋•Œ [count] dependency๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด count๋ผ๋Š” state๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งŒ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค!

โ†’ ์ฆ‰, ๋งจ๋‚  mount, update ๋ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , count state๊ฐ€ ๋ณ€ํ• ๋•Œ๋งŒ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋จ

โ†’ update๋ ๋•Œ๋Š” ์‹คํ–‰์•ˆ๋˜๋Š”๋ฐ mount์‹œ(ํŽ˜์ด์ง€ ์ฒ˜์Œ ๋กœ๋“œ)์—๋Š” ์‹คํ–‰๋˜๊ณ , count๋ผ๋Š” state๊ฐ€ ๋ณ€ํ•  ๋•Œ ์‹คํ–‰์ด ๋œ๋‹ค

ํŽธ๋ฒ•์ธ๋ฐ mount๋ ๋•Œ 1ํšŒ๋งŒ ์‹คํ–‰ํ•  ๋•Œ๋Š” [ ] ์ฒ˜๋Ÿผ dependency์— ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์ง€ ๋ง์ž

useEffect(()=>{
    setTimeout(()=>{ setAlert(false) },2000)
  }, **[]**)

โ†’ dependency๊ฐ€ ์—†์œผ๋ฉด update๋  ๋•Œ๋Š” ์‹คํ–‰ ์•ˆ๋˜๊ณ , mount์—๋งŒ ์‹คํ–‰๋จ

โ†’ ์žฌ๋ Œ๋”๋ง์‹œ์ผœ๋„ ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ

โ†’ ์ปดํฌ๋„ŒํŠธ mount์‹œ 1ํšŒ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ์ด๋ ‡๊ฒŒ ์“ฐ์ž

โ†’ ๋งจ๋‚  update๋ ๋•Œ๋งˆ๋‹ค ์žฌ์‹คํ–‰์ด ์•ˆ๋˜๋‹ˆ๊นŒ ๋” ํšจ์œจ์ ์ด๋‹ค!

return ์ถ”๊ฐ€ ์˜ต์…˜ : clean up function

useEffect(()=>{
    setTimeout(()=>{ setAlert(false) },2000)

	**return () => {
	์ฝ”๋“œ~~~~~~
	}**  

}, **[]**)

โ†’ useEffect ๋™์ž‘ ์ „์— ์‹คํ–‰๋˜๋Š” return ()โ‡’{}

โ†’ ์ด๋ฅผ clean up function ์ด๋ผ๊ณ  ํ•จ! (์‹น ์น˜์šด๋‹ค)

โ†’ ์˜ˆ๋ฅผ ๋“ค์–ด setTimeout ๊ฐ™์€๊ฑธ ์“ฐ๋ฉด ์žฌ๋žœ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค ๋„ˆ๋ฌด ์ž์ฃผ ์‹คํ–‰๋จ ๊ทธ๋Ÿฌ๋ฉด return ๋ฌธ ์•ˆ์—๋‹ค๊ฐ€ ๊ธฐ์กด ํƒ€์ด๋จธ๋Š” ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š”~ ๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์“ฐ๋ฉด ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ!

โ†’ useEffect ์•ˆ์— ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰๋จ!!

โ†’ ๋ณดํ†ต ๊ธฐ์กด์ฝ”๋“œ ์น˜์šฐ๋Š”๊ฑฐ ์—ฌ๊ธฐ์— ๋งŽ์ด ์ž‘์„ฑํ•จ

์ •๋ฆฌํ•˜์ž๋ฉด

1. mount, update์‹œ ๋งค๋ฒˆ ์‹คํ–‰๋จ(dependency X)

useEffect(()=>{
    setTimeout(()=>{ setAlert(false) },2000)
  }) 

2. mount์‹œ, [ ] ์•ˆ์˜ count๋ผ๋Š” state๊ฐ€ ๋ณ€ํ•  ๋•Œ ์‹คํ–‰๋จ(dependency O)

useEffect(()=>{
    setTimeout(()=>{ setAlert(false) },2000)
  }, **[count]**)

3. mount์‹œ 1ํšŒ๋งŒ ์‹คํ–‰(dependency ๋นˆ์นธ)

useEffect(()=>{
    setTimeout(()=>{ setAlert(false) },2000)
  }, **[]**)

useEffect() ์ •๋ฆฌํ•˜๋ฉด

  1. ์žฌ๋ Œ๋”๋ง๋งˆ๋‹ค ์ฝ”๋“œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์œผ๋ฉด
useEffect(()=>{})
  1. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ(mount 1ํšŒ) ๋”ฑ 1๋ฒˆ ์ฝ”๋“œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์œผ๋ฉด
useEffect(()=>{}, **[ ]**)
  1. unmount(์‚ญ์ œ๋ ๋•Œ)์‹œ 1ํšŒ ์ฝ”๋“œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์œผ๋ฉด
useEffect(()=>{
	**return ()=>{
	}**
}, [ ])

โ†’ ๋ณดํ†ต ์ œ๊ฑฐํ•  ๋•Œ return๋ฌธ ์•ˆ์— (clean up function) ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ธฐ ๋•Œ๋ฌธ

โ†’ useEffect์— ์žˆ๋Š” ์ฝ”๋“œ๋ณด๋‹ค ๋จผ์ € ๋”ฑ ํ•œ ๋ฒˆ ์‹คํ–‰๋จ

  1. useEffect ์‹คํ–‰ ์ „์— ๋ญ”๊ฐ€ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์–ธ์ œ๋‚˜ return()โ‡’{} clean up function
useEffect(()=>{
	**return ()=>{
	}**
}, [ ])
  1. ํŠน์ • state๋ณ€๊ฒฝ์‹œ์—๋งŒ ์‹คํ–‰ํ•˜๋ ค๋ฉด [state๋ช…]
useEffect(()=>{}, **[count]**)

Q. ์— ์ˆซ์ž๋ง๊ณ  ๋‹ค๋ฅธ๊ฑฐ ์ž…๋ ฅํ•˜๋ฉด ๊ทธ๋Ÿฌ์ง€๋ง๋ผ๊ณ  ์•ˆ๋‚ด๋ฉ”์„ธ์ง€ ๋„์šฐ๊ธฐ

  1. state๋ณ€์ˆ˜, state๋ณ€๊ฒฝํ•จ์ˆ˜, state์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
let [num, setNum] = useState('')
  1. useEffect์•ˆ์— ์กฐ๊ฑด๋ฌธ ์ž‘์„ฑ
useEffect(()=>{
        if (**isNaN(num) == true**){
            alert("dont do that")
        }
    }, [num])

โ†’ input์— ์ž…๋ ฅํ•œ ๊ฐ’์€ ๋ฌธ์žํ˜•ํƒœ๋กœ ์ถœ๋ ฅ๋จ

โ†’ ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ˆซ์ž๊ฐ€ ์žˆ๋Š” ๋ฌธ์ž์ธ์ง€ ํŒ๋ณ„ํ•˜๋ ค๋ฉด isNaN()์„ ์จ์•ผํ•จ!!!

โ†’ ๋งŒ์•ฝ Not a Number์ด true๋ฉด ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ž๋ผ๋Š” ๋œป์ด๋ฏ€๋กœ alert์ฐฝ์„ ์—ด์–ด์คŒ

โ†’ isNaN(โ€™abcโ€™) : true

โ†’ isNaN(โ€™123โ€™) : false

  1. onChange๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ e.target.value๋ฅผ ๋ฐ›์•„์™€์คŒ
<input onChange={(e)=>{setNum(e.target.value)}}/>

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด