<React> useEffect() ์ •๋ฆฌ

์ดํ˜œ๋ž€ยท2022๋…„ 12์›” 10์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
3/9
post-thumbnail

๐Ÿ“š useEffect()

useEffect๋Š” ์ฝ”๋“œ๊ฐ€ ํ•œ ๋ฒˆ ๋˜๋Š” ํŠน์ •ํ•œ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„๋•Œ๋งŒ ์‹คํ–‰๋˜๋„๋ก ๋„์™€์ค„ ์ˆ˜ ์žˆ๋Š” function์ž…๋‹ˆ๋‹ค.

useEffect๋Š” ๋‘ ๊ฐœ์˜ argument๋ฅผ ๊ฐ€์ง€๋Š” function ์ž…๋‹ˆ๋‹ค.
์ฒซ ๋ฒˆ์งธ argument๋Š” ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ํ•จ์ˆ˜ ์ฝ”๋“œ๊ฐ€ ๋‘ ๋ฒˆ์งธ argument์—๋Š” ์ฝ”๋“œ์˜ ํŠน์ •ํ•œ ๋ถ€๋ถ„์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ๋™์ž‘์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ ๊ฐ์‹œํ•ด์ค„ ๊ฐ’์„ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

function App() {
  const [counter, setValue] = useState(0);
  const [keyword, setKeyword] = useState('');
  const onClick = () => setValue((prev) => prev + 1)
  const onChange = (event) => setKeyword(event.target.value)
  
  // ์นด์šดํŠธ๋‚˜ ํ‚ค์›Œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋งˆ๋‹ค ์‹คํ–‰๋จ
  console.log('im run all the time')
  
 //๐Ÿ“Œ ๋นˆ ๋ฐฐ์—ด ๊ด„ํ˜ธ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ํŽ˜์ด์ง€๊ฐ€ ์ฒ˜์Œ ๋žœ๋”๋ง ๋ ๋•Œ๋งŒ ๋™์ž‘ํ•˜๊ณ  ๋”์ด์ƒ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ
  useEffect(() => {
    console.log('only once')
  }, [])
 //๐Ÿ“Œ keyword๊ฐ€ if ์กฐ๊ฑด๋ฌธ์— ๋งž๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋™์ž‘ํ•จ
  useEffect(() => {
    if(keyword !== '' && keyword.length > 5) {
      console.log('search for', keyword)
    }
  }, [keyword]) // ๐Ÿ“Œ ๋ณ€ํ™”๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์„ ๋ฐฐ์—ด๊ด„ํ˜ธ ์•ˆ์— ๋„ฃ์–ด์คŒ
  
  
  return (
    <div>
      <input 
        value={keyword}
        onChange={onChange}
        type='text'
        placeholder="search here"
      />
      <h1>{counter}</h1>
      <button onClick={onClick}>click me</button>
    </div>
  );
}

์œ„์˜ ์˜ˆ์‹œ์—์„œ ์ฒ˜๋Ÿผ useEffect ๋‘๋ฒˆ์งธ argument์— ๋นˆ ๋ฐฐ์—ด ๊ด„ํ˜ธ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ํŽ˜์ด์ง€๊ฐ€ ๋žœ๋”๋ง ๋˜๋Š” ์ฒ˜์Œ๋งŒ ๋™์ž‘ํ•œ ํ›„ ๋”์ด์ƒ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

useEffect๋ฅผ ์“ฐ์ง€ ์•Š์€ console.log('im run all the time') ์ฝ”๋“œ๋Š” ์นด์šดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰์ฐฝ์— ์ž…๋ ฅ์‹œ ๊ณ„์†ํ•ด์„œ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐฐ์—ด ๊ด„ํ˜ธ ์•ˆ์— ๋ณ€ํ™”๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ์—๋งŒ ์ฒซ ๋ฒˆ์งธ argument๊ฐ€ ๋™์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ useEffect๋Š” API์™€ ๊ฐ™์ด ๋‹จ ํ•œ๋ฒˆ๋งŒ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ์€ ๋‚ด์šฉ์€ useEffect ์•ˆ์— ๋นˆ ๋ฐฐ์—ด ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•ด ์ค„ ์ˆ˜์žˆ๊ณ , ์›ํ•˜๋Š” ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์›ํ•˜๋Š” ๋™์ž‘์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์€ ์ƒํ™ฉ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ๏ธ Cleanup Function

cleanup function์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†์–ด์งˆ ๋•Œ, ์„ค์ •ํ•ด์ค€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†์–ด์งˆ ๋•Œ event listener์„ ์ง€์›Œ์ฃผ๊ฑฐ๋‚˜ console.log์— ๋ญ”๊ฐ€๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cleanup function์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ useEffect ํ•จ์ˆ˜์—์„œ return ๊ฐ’์œผ๋กœ ๋˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋‚ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

function Hello() {
  useEffect(() => {
    console.log('hi'); //๐Ÿ“Œ์ฒ˜์Œ ์‹คํ–‰๋  ๊ฐ’
    return () => console.log('bye'); //๐Ÿ“Œ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†์–ด์งˆ ๋•Œ ๋‚˜ํƒ€๋‚  ํ•จ์ˆ˜ ๊ฐ’
  }, [])
  
  return (
    <h1>hello</h1>
  )
}

function App() {
  const [showing, setShowing] = useState(false);
  const onClick = () => setShowing((prev => !prev))
  return (
    <div>
      {showing ? <Hello /> : null}
      <button onClick={onClick}>{showing ? 'hide' : 'show'}</button>
    </div>
  );
}

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

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