๐ ์ปดํฌ๋ํธ์ Lifecycle ์ด๋?
์ปดํฌ๋ํธ๋
๋ฑ์ฅ(์์ฑ)
,์ ๋ฐ์ดํธ(์ฌ๋ ๋๋ง)
,ํด์ฅ(์ญ์ )
๋๋ ์ธ์์ด ์๋ค.
์ด ๊ณผ์ ์์hook
์ ๊ฑธ ์ ์๋ค. (=useEffect()
)
hook์ผ๋ก ์ปดํฌ๋ํธ ์ธ์ ์ค๊ฐ์ค๊ฐ์ ๋ฌด์ธ๊ฐ ๋ช ๋ น์ ์ค ์ ์๋ค.
ex)<Detail>
ํด์ฅ ์ ์ ~์ข ํด์ฃผ์ธ์(๋ค๋ฅธํ์ด์ง๋ก ์ด๋ ์ ์ ํด์ผํ ์ฝ๋ ๊ตฌํ)
- functionํ์ ๊ฒฝ์ฐ, hook์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
import React, { useEffect } from 'react'; function App() { useEffect( () => { // ์ปดํฌ๋ํธ๊ฐ ๋ฑ์ฅ(Mount) ๋ ๋ ์คํํ ์ฝ๋ ๋ฑ // ์ปดํฌ๋ํธ๊ฐ update ๋ ๋ ์คํํ ์ฝ๋ ๋ฑ return () => { // ์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง ๋(unmount) ์คํํ ์ฝ๋ } }); return () }
- classํ์ ๊ฒฝ์ฐ, hook์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
class App extends React.Component { componentDidMount() { // ์ปดํฌ๋ํธ๊ฐ Mount ๋ ๋ ์คํํ ์ฝ๋ } componentWillUnmount() { // ์ปดํฌ๋ํธ๊ฐ Unmount ๋ ๋ ์คํํ ์ฝ๋ } }
๐ฃ Detail ํ์ด์ง ๋ฐฉ๋ฌธ ํ, alert ์ฐฝ์ด 2์ด ํ์ ์ฌ๋ผ์ง๊ฒ ํ๋ ๊ธฐ๋ฅ ๊ตฌํ
import React, { useEffect } from 'react'; function Detail() { useEffect( () => { // alert ์ฐฝ์ด 2์ด ํ์ ์ฌ๋ผ์ง๊ฒ ํ ์ฝ๋ ์์ฑํ๊ธฐ (setTimeout() ํจ์ ํ์ฉ) }); return ( <div className="alert"> <p> ์ฌ๊ณ ๊ฐ ์ผ๋ง ๋จ์ง ์์์ต๋๋ค</p> </div> ) } // ๊ธฐ๋ฅ ์ฝ๋ ๊ตฌํ import React, { useEffect } from 'react'; function Detail() { let [alert, setAlert] = useState(true) // alert์ฐฝ์ ์ํ๋ณํ๋ฅผ ์ํด state์์ฑ useEffect( () => { let timer = setTimeout( () => { setAlert(false) }, 2000 ) // 2์ด ํ์ alert state์ ๊ฐ์ ๋ณ๊ฒฝ(false)ํด์ฃผ์ธ์ โ ์ ์ฝ๋๋ ์ปดํฌ๋ํธ๊ฐ "๋ฑ์ฅ"ํ ๋ ์คํ๋์ง๋ง, "์ ๋ฐ์ดํธ"๋ ๋๋ ์ญ์ ์คํ๋ผ๋ฒ๋ฆฐ๋ค!!!!!!! (๋ฑ์ฅ & ์ ๋ฐ์ดํธ ๋ ๋ ์คํ๋๋ ์๋ฆฌ์ด๊ธฐ ๋๋ฌธ. ํด์ฅํ ๋ ์คํํ๋ ์ฝ๋๋ return ๋ค์ ์) ๋ฐ๋ผ์ setTimeout()ํจ์๋ฅผ ์ ๊ฑฐํด์ฃผ๋ ๊ธฐ๋ฅ๋ ํจ๊ป ์จ์ค์ผ ํ๋ค. return () => { clearTimeout(timer) } // ์ปดํฌ๋ํธ ํด์ฅ ๊ธฐ๋ฅ์ผ๋ก return () => { ์ปดํฌ๋ํธ ํด์ฅ์ ์คํํ ์ฝ๋ } ์ ์ด์ค๋ค. // ์ปดํฌ๋ํธ๊ฐ ํด์ฅํ ๋ setTimeout์ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ํจ์(clearTimeout)๋ฅผ ์ ์ฉํ๋ค }, [alert]); // useEffect()์ฌ์ฉํ ๋ "์กฐ๊ฑด๋ฌธ"์ ๊ธฐ๋ฅ์ ํด์ค๋ค. // "alert"๋ผ๋ state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง useEffect()์์ ์ฝ๋๋ฅผ ์คํํ๋ผ๋ ์กฐ๊ฑด๋ฌธ // ๋น ๋๊ดํธ([ ])๋ก ๋จ๊ฒจ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฑ์ฅํ ๋ 1๋ฒ๋ง ์คํํ๋ผ๋ ์กฐ๊ฑด๋ฌธ return ( // ์ผํญ์ฐ์ฐ์(์กฐ๊ฑด๋ฌธ)๋ฅผ ์ด์ฉํ์ฌ alert state๊ฐ true์ด๋ฉด ๋ณด์ฌ์ฃผ๊ณ false๋ฉด ์๋ณด์ฌ์ฃผ๊ณ { alert === true ? (<div className="alert"> <p> ์ฌ๊ณ ๊ฐ ์ผ๋ง ๋จ์ง ์์์ต๋๋ค</p> </div>) : null } ) }
๐ก useEffect()
์ ์กฐ๊ฑด๋ฌธ ๊ธฐ๋ฅ ๋ฌ์์ฃผ๊ธฐ
useEffect( () => { ์ปดํฌ๋ํธ๊ฐ "๋ฑ์ฅ", "์ ๋ฐ์ดํธ", "ํด์ฅ" ์ ์คํํ ์ฝ๋}, [])
useEffect() ํจ์ ๋ด ์ฝ๋ฐฑํจ์๋ฅผ ํตํด ์คํํ ์ฝ๋ ๊ตฌํํ๋ค. ๊ทธ๋ฌ๋ ๋ฑ์ฅํ ๋๋ง ํด๋น ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒ์ด ์๋๋ผ, ์ ๋ฐ์ดํธ๋ ๋๋ ๊ฐ์ด ์คํ๋์ด ๋์ค์ ๋ฒ๊ทธ๊ฐ ์๊ธธ ์ ์๋ค.
๋ฐ๋ผ์ ์ฝ๋ฐฑํจ์ ๋ค์ ์กฐ๊ฑด๋ฌธ์ ์ค์ ํด ์ค ์ ์๋ค.useEffect( () => { ์ปดํฌ๋ํธ๊ฐ "๋ฑ์ฅ", "์ ๋ฐ์ดํธ", "ํด์ฅ" ์ ์คํํ ์ฝ๋}, [state])
useEffect()ํจ์ ๋ด ๋ ๋ฒ์งธ ์ธ์์ ๋๊ดํธ([ ])๋ก state๋ฅผ ๋ด์์ค๋ค. ํด๋น state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ์ฝ๋ฐฑํจ์ ๋ด ์ฝ๋๋ฅผ ์คํํ๋ผ๋ ์๋ฏธ์ ์กฐ๊ฑด๋ฌธ์ด๋ค.
state๋ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ด์ ์ ์๋ค. (๋ด๊ธด state๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ๋ ๋ ์คํํ๋ผ๋ ์๋ฏธ)๋ง์ฝ, ๋๊ดํธ([ ])์์ ๋น ์ํ๋ก ๋๋๊ฒ์ ์ฒ์ ์ปดํฌ๋ํธ ๋ฑ์ฅ ์, ํ ๋ฒ๋ง ์คํ๋๊ณ ๋๋๋ฒ๋ฆฌ๋ ํจ๊ณผ๋ฅผ ์ค ์ ์๋ค. ๐๐๐ (์ ๋ฐ์ดํธ ๋ ๋๋ ์คํ๋์ง ์๋๋ค๋ ๋ป์ด ๋๋ค)
๐๐๐ setTimeout()
์ธ ๋ ์ฃผ์์ !!!
๐ ํ์ด๋จธ ํด์ ์คํฌ ์จ์ฃผ๊ธฐ(clearTimeout()
)
function Detail() { let [alert, setAlert] = useState(true) useEffect( () => { let timer = setTimeout( () => { setAlert(false) }, 2000 ) // ์ปดํฌ๋ํธ๊ฐ "๋ฑ์ฅ" && "์ ๋ฐ์ดํธ" ๋ ๋ ๋ชจ๋ ์คํ ๋์ด๋ฒ๋ฆผ // ์๋ ์กฐ๊ฑด๋ฌธ ์ค์ ์ ํตํด ์ฒ์ ๋ฑ์ฅํ ๋ 1๋ฒ๋ง ์คํํ๋๋ก ์ค์ ํ๊ธฐ return () => { clearTimeout(timer) } // ์ปดํฌ๋ํธ๊ฐ ํด์ฅํ ๋ setTimeout์ ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๋ ํจ์(clearTimeout)๋ฅผ ์ ์ฉํ๋ค }, []); // ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ฑ์ฅํ ๋ 1๋ฒ๋ง ์คํํ๋ผ๋ ์กฐ๊ฑด ์ค์
1)
setTimeout()
์ ์ฉ (์ ์ฉ ์, ๋ณ์์ ๋ด๋ ์ต๊ด์ ๋ค์ด์!!)
2) ์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ ๋๋ setTimeout์ด ๋ฐ๋ณต๋์ง ์๋๋ก ์กฐ๊ฑด๋ฌธ([ ])์ ์ค์ ํด์ฃผ์
3) ์ปดํฌ๋ํธ๊ฐ ํด์ฅํ ๋(ํ์ด์ง ์ด๋ ๋ฑ) setTimeout ๊ธฐ๋ฅ์ด ์ ๊ฑฐ๋๋๋กclearTimeout()
์ ์ค์ ํ๋ค.