๋ฌธ์ ์ํฉ
useEffect๋ฅผ ์ฐ๋ฉด์ ์์ฃผ ๋ง๋๋ ์๋ฌ ํธ๋ค๋ง์ ํด๋ณด์.
๋ฌธ์ ์์ธ ๋ฐ ํด๊ฒฐ
useEffect
๋ ํด๋์ค ์ปดํฌ๋ํธ์์ componentDidMount()
์ componentDidUpdate()
๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋ ๋ ๊ฐ๋ฅผ ํฉ์น ์ญํ ์ ํ๋ค๊ณ ๋ฐฐ์ ๋ค. ๋ฐ๋ผ์, useEffect
ํจ์์ ๋ ๋ฒ์งธ ์ธ์์ ๋น ๋ฐฐ์ด์ ๋ฃ๊ฑฐ๋, ์
๋ฐ์ดํธ ํ๊ณ ์ ํ๋ state๋ฅผ ๋ฃ์ด์ฃผ์ด ๋ ๋๋ง์ ํ์๋ฅผ ์ ํํด์ฃผ์ด์ผ ํ๋๋ฐ, ์ ์๋ฌ๋ ํด๋น state๊ฐ ๋น ์ก๊ฑฐ๋, ์๋ชป ๋ค์ด๊ฐ๊ฑฐ๋ ํด์ ๋์ค๋ ์๋ฌ์ด๋ค.
๋ฌธ์ ์ ์์ธ์ด ๋ ์ฝ๋๋ App.js์ Snackbar.js ์ปดํฌ๋ํธ์์์๋ค. App.js์์๋ Redux๋ฅผ ํตํด ๋ฐ์ํ ์ปดํฌ๋ํธ ๋น๋ฉ์ ์ํด size๋ฅผ store์ ๋ฑ๋กํด์ฃผ๊ธฐ ์ํด ๋ฆฌํฉํ ๋ง์ ํ๋ค๊ฐ ์๊ฒผ๋ค.
function App() {
const dispatch = useDispatch();
let [currentSize, setCurrentSize] = useState('')
useEffect(() => {
dispatch(changeSize(currentSize))
}, [dispatch, currentSize])
return (
<Grommet id='container' theme={theme}>
<ResponsiveContext.Consumer>{
size => { setCurrentSize(size)
return (
<>
<Box>
<Header channel={myMedia} theme={theme} />
</Box>
<Body channel={myMedia} />
<Footer channel={myMedia} />
</>
)
}
}
</ResponsiveContext.Consumer>
</Grommet>
);
}
Grommet์ด ์ ๊ณตํ๋ <ResponsiveContext.Consumer>
๋ String์ ํตํด size๋ฅผ ๋ฐํํ๋ค. ์ปค์คํ
theme์ ํตํด์ ์ธ๋ฐํ๊ฒ breakpoints๋ฅผ ์กฐ์ ํ ์ ์์ด์, ๋ชจ๋ ๋ฐ์ํ ์ฌ์ด์ฆ ๋ฐ์ดํฐ๋ ์ด๊ณณ์์ ๋ฐ์ ์ฌ์ฉ ์ค์ด๋ค. ํ์ง๋ง nested components๋ฅผ ๊ณ์ props๋ก๋ง ์ ๋ฌํ๋ ๊ฒ์ ํ๊ณ๋ฅผ ๋๊ปด์ redux๋ฅผ ๋์
ํ๋ค. ๋ฌธ์ ๋ <ResponsiveContext.Consumer>
์ปดํฌ๋ํธ๋ก๋ถํฐ size๋ฅผ dispatch ํด์ผ ํ๋๋ฐ,
useEffect(() => {
dispatch(changeSize(currentSize))
}, [currentSize])
dispatch
๋ฅผ ์ ์ฉํ์ง๋ ์๊ณ , currentSize
๋ง ๊ฐ์งํ๋๋ก ํด๋ฌ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๋ฐฐ์ด์ dispatch
๋ฅผ ํจ๊ป ๋ฃ์ด์ ํด๊ฒฐํ ์ ์์๋ค. ์ด๋ฐ ์๋ฌ๋ useEffect ๋ด๋ถ์ ํจ์๋ฅผ ์ ์ํ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์๋ค.
// snackbar.js
useEffect(() => {
if (props.barStatus === '') {
setOpen(false);
} else {
onOpen();
setStatus(props.barStatus);
}
}, [setOpen, setStatus, props])
๋ค๋ฅธ ์ฝ๋์์๋ ๋์ผํ ๋ฌธ์ ์๋ค. ์ฌ๊ธฐ์์๋ setOpen
์ด false
๋ผ๋ ๊ฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก, ๋ฐฐ์ด์ ๋ฑ๋กํด์ฃผ์ด์ผ ํ๊ณ , setStatus
๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ์
๋ฐ์ดํธ๊ฐ ๋๋ state
๊ทธ ์์ฒด์ธ props
๋ ๋ฐฐ์ด์ ๋ฑ๋กํด์ค๋ค.
'๐ฉโ๐ป > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[react-router-dom] React Router v6์ ๋์ ๋ ์๋ก์ด Navigate API - Redirect ๋์ฒดํ๊ธฐ (0) | 2022.02.10 |
---|---|
[React.js] Re-rendering Issue & Objects are not valid as a React child (0) | 2021.03.17 |
[react] redux๋ก ์ํ ๊ด๋ฆฌํ๊ธฐ #์์ํ๋ฉฐ 2 (0) | 2021.03.09 |
[react] redux๋ก ์ํ ๊ด๋ฆฌํ๊ธฐ #์์ํ๋ฉฐ (0) | 2021.03.08 |
[React.js Hooks] useState, useEffect, useReducer (0) | 2021.02.28 |