React.memo
React.memo๋ Higher-Order Components(HOC)์ด๋ค.
๐ Higher-Order Components(HOC)๋ ์ปดํฌ๋ํธ๋ฅผ ์ธ์๋ก ๋ฐ์ ์๋ก์ด ์ปดํฌ๋ํธ๋กค ๋ค์ returnํด์ฃผ๋ ํจ์์ด๋ค.
const NewComponent = higherOrderComponent(WrappedComponent);
์ผ๋ฐ ์ปดํฌ๋ํธ๋ ์ธ์๋ก ๋ฐ์ props๋ฅผ UI์ ํ์ฉํ๋ ๋ฐ๋ฉด์, higher-order component๋ ์ธ์๋ก ๋ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์๋ก์ด ๋ณ๋์ ์ปดํฌ๋ํธ๋ก ๋ง๋ ๋ค. HOC๋ ๋ฆฌ์กํธ์ API๊ฐ ์๋๋ผ ๋ฆฌ์กํธ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ๋๋ฐ ์์ด์์ ์ผ์ข ์ ํจํด์ด๋ผ๊ณ ๋ณด๋ฉด๋๋ค.
React.memo์ ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
const MyComponent = React.memo((props) => {
return (/*์ปดํฌ๋ํธ ๋ ๋๋ง ์ฝ๋*/)}
);
๋ง์ฝ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ props๋ฅผ ๋ฐ์ ๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋๋งํ๋ค๋ฉด React.memo๋ฅผ ์ฌ์ฉํ์ฌ ๋ถํ์ํ ์ปดํฌ๋ํธ ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์๋ค.
์ฆ, ์ปดํฌ๋ํธ์ ๊ฐ์ props๊ฐ ๋ค์ด์จ๋ค๋ฉด ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ ๋ ๋๋ง ๊ณผ์ ์ ์คํตํ๊ณ ๋ง์ง๋ง์ ๋ ๋๋ง๋ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ๋ค.
React.memo๋ ์ค์ง props๊ฐ ๋ณ๊ฒฝ๋๋์ง ์๋์ง๋ง ์ฒดํฌํ๋ค. ๋ง์ฝ React.memo์ ๊ฐ์ธ์ง ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ํจ์ ๋ด๋ถ์์ useState๋ useContext๊ฐ์ ํ ์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, state๋ context๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก props๋ก ๋ค์ด์จ object๋ shallow compare๋ก ๋น๊ตํ๋ค. ์ฆ, props๋ก ๋ค์ด์จ number, string๊ณผ ๊ฐ์ scarlar ๊ฐ์ ์ค์ ๊ฐ์ด ๋์ผํ๊ฐ๋ฅผ ๋น๊ตํ์ง๋ง, object์ ๊ฒฝ์ฐ scarlar ๊ฐ๊ณผ ๋ฌ๋ฆฌ ๊ฐ์ ๊ฐ์ 'reference(์ฐธ์กฐ)'ํ๊ณ ์๋์ง๋ฅผ ๋น๊ต ํ๋ค.
๋ง์ฝ ๋น๊ต๋ฐฉ์์ ์ปค์คํ ํ๊ณ ์ถ๋ค๋ฉด ์๋ ์ฝ๋์ฒ๋ผ ๋น๊ตํจ์๋ฅผ React.memo์ ๋๋ฒ์งธ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
function MyComponent(props) {
/* ์ปดํฌ๋ํธ ๋ ๋๋ง ์ฝ๋ */
}
function areEqual(prevProps, nextProps) {
/*
๋ง์ฝ ์ ๋ฌ๋๋ nextProps๊ฐ prevProps์ ๊ฐ๋ค๋ฉด true๋ฅผ ๋ฐํ, ๊ฐ์ง ์๋ค๋ฉด false๋ฅผ ๋ฐํ
*/
}
export default React.memo(MyComponent, areEqual);
useMemo
useMemo๋ ๋ฉ๋ชจ์ด์ฆ๋ ๊ฐ์ returnํ๋ hook์ด๋ค.
์ธ์๋ก ํจ์์ ์์กด ๊ฐ(dependencies)์ ๋ฐ๋๋ค. useMemo๋ ๋๋ฒ์งธ ์ธ์๋ก ์ค ์์กด ์ธ์ ์ค์ ํ๋๋ผ๋ ๋ณ๊ฒฝ๋๋ฉด ๊ฐ์ ์ฌ ๊ณ์ฐํ๋ค. ์ด๋ฅผ ํตํด ๋งค ๋ ๋์๋ง๋ค ์์๋๋ ๋ถํ์ํ ๊ณ์ฐ์ ํผํ ์ ์๋ค. ๋ง์ฝ dependencies ์ธ์๋ก ์๋ฌด๊ฒ๋ ์ ๋ฌ๋์ง ์๋๋ค๋ฉด, ๋ ๋์๋ง๋ค ํญ์ ๊ฐ์ ์๋กญ๊ฒ ๊ณ์ฐํ์ฌ returnํ๋ค.
์๋์ ์ฝ๋๋ a, b๊ฐ์ด ๋ณํ ๋๋ง ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ค์ด์จ ํจ์๊ฐ ์คํ๋์ด ์ฌ๊ณ์ฐ์ด ๋๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ์ด์ฆ๋ ๊ฐ์ returnํ๋ค.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
๊ณตํต์
React.memo์ useMemo ๋ชจ๋ props๊ฐ ๋ณํ์ง ์์ผ๋ฉด(์ด์ props์ ๋์ผํ๋ฉด) ์ธ์๋ก ๋๊ธด ํจ์๋ ์ฌ์คํ๋์ง ์๊ณ , ์ด์ ์ ๋ฉ๋ชจ์ด์ฆ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๋ ์ ์์ ๊ณตํต์ ์ด์๋ค.
์๋ React.memo์ useMemo๋ฅผ ์ฌ์ฉํ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋๊ฐ์ง ์ฝ๋๋ props.name์ ๊ฐ์ด ๋ณํ์ง ์๋๋ค๋ฉด ๋ฆฌ๋ ๋๋ง ๋์ง ์๊ณ ์ด์ ์ ๊ฐ์ ๋ฐํํ๋ค๋ ์ ์์ ๋์ผํ๊ฒ ๋์ํ๋ค.
/*๋ณ๋๋ก ๋๋ฒ์งธ ์ธ์๋ฅผ ๋๊ธฐ์ง ์์ ๊ฒฝ์ฐ props๊ฐ ๋ณํ์ง ์๋๋ค๋ฉด ์ฌ๋ ๋๋ง ๋์ง ์์*/
const NameTag = React.memo(
(props) => <div>{props.name}</div>
);
/*๋ง์ฝ ๋๋ฒ์งธ ์ธ์๋ก ํน์ props.name๊ฐ์ด ๊ฐ์ง ์์๋๋ง ์ฌ๋ ๋๋ง ํ๋๋ก ์ปค์คํ
๋น๊ต ํจ์๋ฅผ ๋ฃ์ด์ฃผ๊ณ ์ถ์ ๋*/
const NameTag = React.memo(
(props) => <div>{props.name}</div>
,
(prevProps, nextProps) => prevProps.name === nextProps.name
)
function NameTag(props) {
return useMemo(
() => <div>{props.name}</div>
,
[props.name]
)
}
์ฐจ์ด์
1. React.memo๋ HOC, useMemo๋ hook์ด๋ค.
2. React.memo๋ HOC์ด๊ธฐ ๋๋ฌธ์ ํด๋์คํ ์ปดํฌ๋ํธ, ํจ์ํ ์ปดํฌ๋ํธ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง, useMemo๋ hook์ด๊ธฐ ๋๋ฌธ์ ์ค์ง ํจ์ํ ์ปดํฌ๋ํธ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
'Web > Js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React 18์ useSyncExternalStore, Tearing ํ์์ ๋ฌด์์ธ๊ฐ? (0) | 2023.01.18 |
---|---|
useEffect์ useLayoutEffect (0) | 2023.01.11 |
[React]setState Callback ํจ์ ์ฌ์ฉ (0) | 2023.01.11 |
[Redux] redux ๊ธฐ๋ณธ - action dispatch / subscribe (0) | 2022.12.19 |
Nuxt js dot env ์ ์ฉํ๊ธฐ (์์ฒด cross-env ์ ์ฉ๊ธฐ) (0) | 2022.05.12 |