[๐Ÿ’ŽReact] Lifecycle, useEffect

h-a-n-aยท2023๋…„ 3์›” 6์ผ
1

๐Ÿ’ŽReact

๋ชฉ๋ก ๋ณด๊ธฐ
4/14

Lifecycle

์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  ์‚ฌ๋ผ์ง€๋Š” ์ˆœ๊ฐ„๊นŒ์ง€์˜ ํ•˜๋‚˜์˜ ์ƒ๋ช… ์ฃผ๊ธฐ.

mount: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œ์‹œ๋ ๋•Œ ->update : ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ์š”์†Œ๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ -> unmount : ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ

useEffect

useEffect๋Š” ์œ„์˜ ์„ธ ์‹œ์  ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ์„œ, ํ•ด๋‹น ์‹œ์ ์— ํŠน์ •ํ•œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ํ•˜๋Š” Hook์ด๋‹ค.

ํฌ๊ฒŒ ๋ณด๋ฉด ๋‹ค์Œ ๋‘ ๊ฐ€์ง€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ, ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.
1. ์ƒ๋‹จ์—์„œ import {useEffect} from 'react'
2. ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ถ”๊ฐ€ํ•ด์„œ ์•ˆ์— ์ฝ”๋“œ ์ ์œผ๋ฉด, ์ปดํฌ๋„ŒํŠธ๊ฐ€ mount& update ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋จ

import {useEffect,useState} from 'react'

function App(){
useEffect(()=>{console.log(111)})
let [count,setCount]=useState(0)
return(
<div>
<Hi/>
<button onClick={()=>{setCount(count+1)}}>๋ฒ„ํŠผ</button>
</div>
)
}
function Hi(){
return(
<>
<h4>์•ˆ๋…•!</h4>
</>
)
}

useEffect์˜ ์šฉ๋„

ํŽ˜์ด์ง€ ๋กœ๋“œ๋ ๋•Œ๋‚˜ ๋ฒ„ํŠผ ํด๋ฆญํ•  ๋•Œ๋‚˜ ์ฝ˜์†”์ฐฝ์— ์—ด์‹ฌํžˆ 111์ด ์ถœ๋ ฅ๋œ๋‹ค.
๊ทผ๋ฐ ๊ทธ๋ƒฅ ์ด๋Ÿฐ ๊ธฐ๋Šฅ๋งŒ ๋˜๋Š”๊ฑฐ๋ผ๋ฉด ๊ตณ์ด useEffect ์•ˆ์— ์ ๋Š” ๊ฒƒ์˜ ์žฅ์ ์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค. ๊ทธ๋ƒฅ useEffect()๋ฐ–์— ์ ์–ด๋„ ๋˜์ง€ ์•Š๋‚˜? ๋ผ๋Š” ์˜๊ตฌ์‹ฌ์ด ๋“ค๋•Œ, ์•Œ๊ฒŒ ๋œ ์‚ฌ์‹ค.
๋ฐ”๋กœ useEffect ์•ˆ์— ์ ์€ ์ฝ”๋“œ๋Š” HTML์ด ๋ Œ๋”๋ง๋œ ์ดํ›„์— ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ!

์—ฌ๊ธฐ์„œ ์™œ useEffect๋ผ๊ณ  ์ž‘๋ช…ํ–ˆ๋Š”์ง€๋„ ์•Œ๋ฉด ๋„์›€์ด ๋˜๋Š”๋ฐ,
ํ•จ์ˆ˜ ์•ˆ์— ํ•ต์‹ฌ๊ธฐ๋Šฅ ์™ธ์— ์“ธ๋ฐ์—†๋Š” ๊ธฐ๋Šฅ๋“ค์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์šฉ์–ด๋กœ side Effect๋ผ๊ณ  ํ•œ๋‹ค. useEffect๋„ ์ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ปดํฌ๋„ŒํŠธ์˜ ํ•ต์‹ฌ๊ธฐ๋Šฅ์€ html ๋ Œ๋”๋ง์ด๊ธฐ์—, ์ด ์™ธ ์“ธ๋ฐ์—†๋Š” ๊ธฐ๋Šฅ๋“ค์€ ๋‹ค useEffect์•ˆ์— ์ง‘์–ด๋„ฃ์œผ๋ผ๋Š” ๊ฒƒ์ด๋‹ค.
๋ฐ˜๋ณต์—ฐ์‚ฐ, ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€์ ธ์˜ค๋Š” ์ž‘์—…, ํƒ€์ด๋จธ ์ด๋Ÿฐ๊ฑด useEffect์•ˆ์— ์ €์žฅ!

mount: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ

useEffect(์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œ์‹œ๋  ๋•Œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜,[])

update: ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ์š”์†Œ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ

useEffect(์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์— ์ ์€ ์š”์†Œ๋“ค์ด ์—…๋ฐ์ดํŠธ๋˜๋Š” ์‹œ์ ์— ์‹คํ–‰ํ•  ํ•จ์ˆ˜,[์—…๋ฐ์ดํŠธ๋˜๋Š”์ง€ ์ง€์ผœ๋ณผ ๋ณ€์ˆ˜/State])

unmount: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ

useEffect(()=>{return ()=> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜})

์‹คํ–‰์กฐ๊ฑด []

  // mountํ˜น์€ update ๋ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
 useEffect(() => {
    setTimeout(() => {
      setBox(false);
    }, 2000);
  });

//์ตœ์ดˆ mount๋ ๋•Œ ์—ฌ์ „ํžˆ ์‹คํ–‰๋จ, but ์ดํ›„ []์•ˆ๊ฐ’์ด ๋‹ฌ๋ผ์งˆ๋•Œ๋งŒ ๋ Œ๋”๋ง!
   useEffect(() => {
    setTimeout(() => {
      setBox(false);
    }, 2000);
  }, []);

useEffect()์˜ ๋‘˜์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ []์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ(์ „๋ฌธ์šฉ์–ด๋กœ Dependency) ๋ณ€์ˆ˜๋‚˜ state๋“ฑ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ[]์•ˆ์˜ ๋ณ€์ˆ˜๋‚˜ state๊ฐ€ ๋ณ€ํ• ๋•Œ๋งŒ useEffect์•ˆ์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด์คŒ. ์ฐธ๊ณ ๋กœ, ์—ฌ๋Ÿฌ๊ฐœ์˜ state ๋„ฃ์–ด๋„ ์ƒ๊ด€์—†๋‹ค!
๋งŒ์•ฝ []์•ˆ์— ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์ง€ ์•Š์œผ๋ฉด mountํ• ๋•Œ๋งŒ(ํŽ˜์ด์ง€ ๋กœ๋“œํ• ๋•Œ๋งŒ) ๋”ฑ 1ํšŒ ์‹คํ–‰๋˜๊ณ  ์ดํ›„๋กœ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

clean up function

useEffect ๋™์ž‘ํ•˜๊ธฐ ์ „์— ํŠน์ •์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์œผ๋ฉด return ()=>{} ์•ˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. mount๋•Œ๋งˆ๋‹ค ํƒ€์ด๋จธ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ์žˆ์œผ๋‹ˆ ๋ช‡ ๋ฐฑ๊ฐœ๊ฐ€ ์Œ“์ด๊ธฐ๋„ ํ•ด ๋ฒ„๊ทธ๋ฅผ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•˜๊ณ ์ž, ํƒ€์ด๋จธ ๋งŒ๋“ค๊ธฐ ์ „ ๊ธฐ์กด ํƒ€์ด๋จธ๋Š” ์ œ๊ฑฐํ•ด์ฃผ์„ธ์š” ๋ผ๋Š” ์˜๋ฏธ์—์„œ return()=>{}์•ˆ์— ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ๋„ ํ•œ๋‹ค. ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— [] ๊นŒ์ง€ ์จ์ฃผ๋ฉด ๊ธˆ์ƒ์ฒจํ™”!

function App(){
let a=setTimeout(()=>{
	console.log(1)},2000)
useEffect(()=>{
a;
return ()=>{
clearTimeout(a)
}
},[])
 return(
 <div>
 <Hi/>
 </div>
)

์ฐธ๊ณ ์ž๋ฃŒ:
์• ํ”Œ์ฝ”๋”ฉ
์œ ํŠœ๋ธŒ ๋ณ„์ฝ”๋”ฉ

profile
ํ•˜๋ฃจํ•˜๋ฃจ๊ฐ€ ์—ฐ์Šต์ด๋‹ˆ ๋‚ด์ผ์€ ๋” ๊ฐ•ํ•ด์งˆ ๊ฒ๋‹ˆ๋‹ค

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