๐ useEffect
useEffect()๋ ํ์ด์ง์ ๋ง์ดํธ, ์ธ๋ง์ดํธ, ์ ๋ฐ์ดํธ ์ ์์ ์ ์ค์ ํ๋ค.
์ฉ์ด | ์ค๋ช |
Mount | ์ปดํฌ๋ํธ๊ฐ ํ์ด์ง์ ๋ํ๋จ |
unMount | ์ปดํฌ๋ํธ๊ฐ ํ์ด์ง์์ ์ฌ๋ผ์ง |
์ ๋ฐ์ดํธ๋ useEffect() ํน์ ๊ฐ์ ์์กดํ์ฌ ํด๋น ๊ฐ์ด ๋ณ๊ฒฝ, ์คํ๋๋ฉด ํด๋น useEffect()๋ฅผ ์ฌ์คํํ๋ค.
useEffect()์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
useEffect(()=> {
// ๋ง์ดํธ ์๋ฃ ํ ์คํํ ์ฝ๋
return () => {
// ์ธ๋ง์ดํธ ์๋ฃ ํ ์คํํ ์ฝ๋
}
}, [dependencies])
๐ป Code
๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
๐ EffectComponent.tsx
import React, { useEffect, useState } from 'react'
import { PopupComponent } from './PopupComponent'
export function EffectComponent(): JSX.Element {
const [isOpen, setIsOpen] = useState<boolean>(false)
// !: ๋ถ์ ์ฐ์ฐ์ boolํ์
์ ๊ฐ์ ๋ฐ๋๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค.
// true -> false
// false -> true
const handlerBoolean = () => setIsOpen(!isOpen)
return (
<div style={{ textAlign: 'center' }}>
/* ์ผํญ ์ฐ์ฐ์
//์กฐ๊ฑด ? ์กฐ๊ฑด์ด true์ผ ๋ ๋ฐํ๊ฐ : ์กฐ๊ฑด์ด false์ผ ๋ ๋ฐํ๊ฐ
/*
<button onClick={handlerBoolean}>{isOpen ? '๋ซ๊ธฐ' : '์ด๊ธฐ'}</button>
/* ๋
ผ๋ฆฌ๊ณฑ(&&)
// ์ผ์ชฝ๋ถํฐ ๊ฐ์ ๊ฒ์ฌํ์ฌ true๊ฐ์ ๊ฐ์ง๋ฉด ๋ง์ง๋ง ๊ฐ์ ๋ฐํ
*/
{isOpen && <PopupComponent />}
</div>
)
}
isOpen์ ์ํ์ ๋ฐ๋ผ์ ์ปดํฌ๋ํธ(<PopupComponent/>)๋ฅผ ํ์ด์ง์ ๋ง์ดํธ/์ธ๋ง์ดํธ ์ํค๋ ์ฝ๋์ด๋ค.
๋ถ์ ์ฐ์ฐ์, ์ผํญ ์ฐ์ฐ์, ๋ ผ๋ฆฌํฉ(&&)์ด ๋ฑ์ฅํ๋๋ฐ ์ฃผ์์ ์ฐธ๊ณ ํ๋ฉด ๋๋ค.
๊ทธ๋ผ ์ด์ ๋ฒํผ์ ๋๋ ์ ๋, isOpen์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด์ <PopupComponent/>๊ฐ ๋ํ๋๋๋ฐ
PopupComponent๋ ์๋์ ๊ฐ๋ค.
๐ PopupComponent.tsx
import React, { useEffect } from 'react'
export function PopupComponent(): JSX.Element {
useEffect(() => {
console.log('๋ฉ๋กฑ')
return () => {
console.log('Bye')
}
})
return <div>๐</div>
}
์์ฑ ํ, ์ง์ ํ๋ App.tsx์ ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๋ฉด ๋๋ค.
๐ App.tsx
import { EffectComponent } from './components/EffectComponent'
function App(): JSX.Element {
return (
<>
<EffectComponent />
</>
)
}
export default App
์ด์ ๋ฆฌ์กํธ ์๋ฒ๋ฅผ ์คํํ๊ณ Ctrl + F12 ๋ฅผ ๋๋ฌ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด์ด Console ํญ์ผ๋ก ์ด๋ํ๋ค.
์ด์ "์ด๊ธฐ"๋ฒํผ์ ๋๋ฌ ํ์ธํด๋ณด์.
์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋๋ฉด์ useEffect()๊ฐ ์คํ๋๋ค.
โ๋ง์ดํธ๋ง ์์ผฐ๋๋ฐ ์ "Bye"๊ฐ ์ฐํ์ง?
๋ฆฌ์กํธ๋ ๊ฐ๋ฐ ์ <React.StrictMode>๋ฅผ ์ง์ํ๋๋ฐ, ์ด๋ ์ค๋ฅ ๊ฒ์ฌ๋ฅผ ํ๊ธฐ ์ํด 2๋ฒ์ ๋ ๋๋ง์ด ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ ํ ๋ฒ ๋ ๋๋ง ๋๊ณ , ์ธ๋ง์ดํธ ํ ๋ค์ ๋ ๋๋ง์ ํด์
"๋ฉ๋กฑ" - "Bye" - "๋ฉ๋กฑ"์ด ๋ํ๋๋ค.
๊ฑฐ์ฌ๋ฆฐ๋คํ๋ฉด์ main.tsx ํ์ผ์ ๊ฐ์ <React.StrictMode>๋ฅผ ์ง์์ฃผ๋ฉด ๋๋ค.
๐ main.tsx
import './assets/main.css'
import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(<App />)
'Framework > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ React ] useMemo์ ๋ํด ์์๋ณด์. (0) | 2024.04.04 |
---|---|
[ React ] useRef์ ๋ํด ์์๋ณด์. (0) | 2024.04.04 |
[ React ] useState()๋ฅผ ํ์ฉํด๋ณด์. (feat. TypeScript) (0) | 2024.03.11 |
[ React ] CRA - ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ณด์. (0) | 2024.03.06 |
[ React ] ๋ฆฌ์กํธ์ ๋ํด ์์๋ณด์. (0) | 2024.03.06 |