import { useEffect, useState } from "react";
let [count, setCount] = useState(0)
(์๋์์ ์ฌ์ฉํ console.log ์์๋ ๊ทธ๋ฅ ๋ ๋ฆฝ์ ์ธ ๊ฑฐ๋ก ์ฌ์ฉ๋จ)
useEffect(()=>{
console.log('์๋
')
})
{count} -> ์ซ์๊ฐ ์ฆ๊ฐ
<button onClick={()=>{ setCount(count+1) }}>๋ฒํผ</button>
โ ๋คํด..
โ html์ ๋จผ์ ๋ณด์ฌ์ค ๋ค์ ์ด๋ ค์ด ์ฝ๋๋ฅผ ๊ทธ ๋ค์์ ์คํํ๋ฏ๋ก html์ด ๋นจ๋ฆฌ ๋ณด์ธ๋น!
โ HTML ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ณด๋ค๋ ๋ ์ค์ํ ๊ฑฐ๋ผ์ ๋์ค์ ๋ณด์ฌ์ค๋ ๋จ
Side Effect : ํจ์์ ํต์ฌ๊ธฐ๋ฅ๊ณผ ์๊ด์๋ ๋ถ๊ฐ๊ธฐ๋ฅ
โ ์ฌ๊ธฐ์ ๋ฐ์จ ์ด๋ฆ
โ useEffect์ ๋ค์ด๊ฐ ์ฝ๋๋ค์ side effect ์ฝ๋ ๋ณด๊ดํจ์ด๊ธฐ ๋๋ฌธ!
โ main ๊ธฐ๋ฅ, ํต์ฌ๊ธฐ๋ฅ, ๋๋๋ง๊ธฐ๋ฅ์ด ์๋๋ผ ๋ถ๊ฐ๊ธฐ๋ฅ
let [alert, setAlert] = useState(**true**)
useEffect(()=>{
setTimeout(()=>{setAlert(**false**)}, 2000)
}, [])
{
alert == true
? <div className="alert alert-warning">
2์ด ์ด๋ด ๊ตฌ๋งค์ ํ ์ธ
</div>
: null
}
โ ์ผํญ์ฐ์ฐ์ ์ฌ์ฉ
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๊ฐ ๋ณํ ๋ ์คํ์ด ๋๋ค
useEffect(()=>{
setTimeout(()=>{ setAlert(false) },2000)
}, **[]**)
โ dependency๊ฐ ์์ผ๋ฉด update๋ ๋๋ ์คํ ์๋๊ณ , mount์๋ง ์คํ๋จ
โ ์ฌ๋ ๋๋ง์์ผ๋ ์์ ์๋ ์ฝ๋๊ฐ ์คํ๋์ง ์์
โ ์ปดํฌ๋ํธ mount์ 1ํ๋ง ์คํํ๊ณ ์ถ์ผ๋ฉด ์ด๋ ๊ฒ ์ฐ์
โ ๋งจ๋ update๋ ๋๋ง๋ค ์ฌ์คํ์ด ์๋๋๊น ๋ ํจ์จ์ ์ด๋ค!
useEffect(()=>{
setTimeout(()=>{ setAlert(false) },2000)
**return () => {
์ฝ๋~~~~~~
}**
}, **[]**)
โ useEffect ๋์ ์ ์ ์คํ๋๋ return ()โ{}
โ ์ด๋ฅผ clean up function ์ด๋ผ๊ณ ํจ! (์น ์น์ด๋ค)
โ ์๋ฅผ ๋ค์ด setTimeout ๊ฐ์๊ฑธ ์ฐ๋ฉด ์ฌ๋๋๋ง๋ ๋๋ง๋ค ๋๋ฌด ์์ฃผ ์คํ๋จ ๊ทธ๋ฌ๋ฉด return ๋ฌธ ์์๋ค๊ฐ ๊ธฐ์กด ํ์ด๋จธ๋ ์ ๊ฑฐํด์ฃผ์ธ์~ ๋ผ๋ ์ฝ๋๋ฅผ ์ฐ๋ฉด ๋นํจ์จ์ ์ธ ์ฝ๋ ์ ๊ฑฐํ ์ ์์!
โ useEffect ์์ ์๋ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์คํ๋จ!!
โ ๋ณดํต ๊ธฐ์กด์ฝ๋ ์น์ฐ๋๊ฑฐ ์ฌ๊ธฐ์ ๋ง์ด ์์ฑํจ
์ ๋ฆฌํ์๋ฉด
useEffect(()=>{
setTimeout(()=>{ setAlert(false) },2000)
})
useEffect(()=>{
setTimeout(()=>{ setAlert(false) },2000)
}, **[count]**)
useEffect(()=>{
setTimeout(()=>{ setAlert(false) },2000)
}, **[]**)
useEffect(()=>{})
useEffect(()=>{}, **[ ]**)
useEffect(()=>{
**return ()=>{
}**
}, [ ])
โ ๋ณดํต ์ ๊ฑฐํ ๋ return๋ฌธ ์์ (clean up function) ์ฝ๋๋ฅผ ๋ฃ๊ธฐ ๋๋ฌธ
โ useEffect์ ์๋ ์ฝ๋๋ณด๋ค ๋จผ์ ๋ฑ ํ ๋ฒ ์คํ๋จ
useEffect(()=>{
**return ()=>{
}**
}, [ ])
useEffect(()=>{}, **[count]**)
let [num, setNum] = useState('')
useEffect(()=>{
if (**isNaN(num) == true**){
alert("dont do that")
}
}, [num])
โ input์ ์ ๋ ฅํ ๊ฐ์ ๋ฌธ์ํํ๋ก ์ถ๋ ฅ๋จ
โ ๊ทธ๋ฌ๋ฏ๋ก ์ซ์๊ฐ ์๋ ๋ฌธ์์ธ์ง ํ๋ณํ๋ ค๋ฉด isNaN()์ ์จ์ผํจ!!!
โ ๋ง์ฝ Not a Number์ด true๋ฉด ์ซ์๊ฐ ์๋๋ผ ๋ฌธ์๋ผ๋ ๋ป์ด๋ฏ๋ก alert์ฐฝ์ ์ด์ด์ค
โ isNaN(โabcโ) : true
โ isNaN(โ123โ) : false
<input onChange={(e)=>{setNum(e.target.value)}}/>