React๋ ๊ณ ์ฐจ ์ปดํผ๋ํธ(Higher Order Component, HOC)ย
React.memo()
๋ฅผ ์ ๊ณตํ๋ค. ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ง(Memoizing)ํจ์ผ๋ก์จ, ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๊ฑด๋๋ด๋ค.
const App = () => {
return (
<div>์๋
ํ์ธ์</div>
<div>์๋
ํ๊ณ์ธ์</div>
)
}
export default React.memo(App) // ์ปดํฌ๋ํธ๋ฅผ ์์ฑ ํ ์๋์ React.memo๋ฅผ ์ฌ์ฉํ๋ค.
import './App.css';
import User from './components/User';
import withCurrent from './components/withCurrent';
const CurrentUser = withCurrent(User); // withCurrent ์ปดํฌ๋ํธ์ User ์ปดํฌ๋ํธ๋ฅผ ๋งค๊ฒจ๋ณ์๋ก
// ์ฌ์ฉํจ
function App() {
return (
<div>
<CurrentUser userName="uey" />
</div>
);
}
export default App;
import React, { useEffect, useState } from 'react';
function withCurrent(Component) { // user ์ปดํฌ๋ํธ
const NewComponent = ({ userName, props }) => {
const [user, setUser] = useState('');
useEffect(() => {
let timer = setTimeout(() => {
setUser(userName);
clearTimeout(timer);
}, 1000);
});
if (!user) return 'Loading';
return <Component {...props} user={user} />; // user ์ปดํฌ๋ํธ ์ฌ์ฉ
};
return NewComponent;
}
export default withCurrent;
import React from 'react';
function User({ user }) { // withCurrent๋ก๋ถํฐ์จ props
return (
<div>
<strong>{user}</strong>
</div>
);
}
export default User;
React๋ ๋จผ์ ์ปดํผ๋ํธ๋ฅผ ๋ ๋๋ง(rendering) ํ ๋ค, ์ด์ ๋ ๋๋ ๊ฒฐ๊ณผ์ ๋น๊ตํ์ฌ DOM ์ ๋ฐ์ดํธ๋ฅผ ๊ฒฐ์ ํ๋ค. ๋ง์ฝ ๋ ๋ ๊ฒฐ๊ณผ๊ฐ ์ด์ ๊ณผ ๋ค๋ฅด๋ค๋ฉด, React๋ DOM์ ์ ๋ฐ์ดํธํ๋ค.
๋ค์ ๋ ๋๋ง ๊ฒฐ๊ณผ์ ์ด์ ๊ฒฐ๊ณผ์ ๋น๊ต๋ ๋น ๋ฅด๋ค. ํ์ง๋ง ์ด๋ค ์ํฉ์์๋ ์ด ๊ณผ์ ์ ์๋๋ฅผ ์ข ๋ ๋์ผ ์ ์๋ค.
์ปดํผ๋ํธ๊ฐย React.memo()
๋ก ๋ํ ๋ ๋, React๋ ์ปดํผ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ง(Memoizing)ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ ๋๋ง์ด ์ผ์ด๋ ๋ย props
๊ฐ ๊ฐ๋ค๋ฉด, React๋ ๋ฉ๋ชจ์ด์ง(Memoizing)๋ ๋ด์ฉ์ ์ฌ์ฌ์ฉํ๋ค.
React.memo()๋ props ํน์ props ๊ฐ์ฒด๋ฅผ ๋น๊ตํ ๋ ์์ ๋น๊ต๋ฅผ ํ๋ค. โ depth 1๋ง ํ๋จ
๋น๊ต ๋ฐฉ์์ ์์ ํ๊ณ ์ถ๋ค๋ฉด ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ๋น๊ตํจ์๋ฅผ ๋ง๋ค์ด ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
React.memo(Component, [areEqual(prevProps, nextProps)]);
function moviePropsAreEqual(prevData, nextData) {
return (
prevData.title === nextData.title &&
prevData.releaseDate === nextData.releaseDate
);
}
const MemoizedMovie2 = React.memo(Movie, moviePropsAreEqual);
moviePropsAreEqual()
ย ํจ์๋ ์ด์ ย props
์ ํ์ฌย props
๊ฐ ๊ฐ๋ค๋ฉดย true
๋ฅผ ๋ฐํํ ๊ฒ์ด๋ค.React.memo()
๋ฅผ ์ฌ์ฉํ๊ธฐ ๊ฐ์ฅ ์ข์ ์ผ์ด์ค๋ ํจ์ํ ์ปดํผ๋ํธ๊ฐ ๊ฐ์ย props
๋ก ์์ฃผ ๋ ๋๋ง ๋ ๊ฑฐ๋ผ ์์๋ ๋์ด๋ค.React.memo()
๋ก ์ปดํผ๋ํธ๋ฅผ ๋ํํ ํ์๊ฐ ์๋ค.useMemo
ํจ์ํ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ํด๋น ํจ์๋ฅผ ํธ์ถํ๊ณ ๊ณ์ฐํ ๊ฐ์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก, ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ๋น ๋ฅด๊ฒ ๋ฐํํ ์ ์์ต๋๋ค. useMemo
๋ ์ฃผ๋ก ๊ณ์ฐ์ด ๋น์ฉ์ด ๋ง์ด ๋๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.props
์ ๋ค์ย props
์ ๋๋ฑ ๋น๊ต๋ฅผ ์ํด ๋น๊ต ํจ์๋ฅผ ์ํํ๋ค.false
๋ฅผ ๋ฐํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, React๋ ์ด์ ๋ ๋๋ง ๋ด์ฉ๊ณผ ๋ค์ ๋ ๋๋ง ๋ด์ฉ์ ๋น๊ตํ ๊ฒ์ด๋ค.๋์ด๋ฌด.. ํ๋ค์๋ค. state๊ฐ ๋ง์ผ๋๊น ๋๋ฌด ๊ผฌ์ด๊ณ .. ์ง๊ธ์ ๋๋ฌด ์กธ๋ ค์ ๋ด์ผ ๋ ์์ธํ ์ ๋ฆฌํ ์์ ์ด๋ค.
ํ ๋์ ๋ถํ๋ ํ์ดํ๋ก๊ทธ๋๋ฐ.. ์ ๋ฐ ๋๋ผ ์ ์๊ฒ ํด์ฃผ์ธ์ ์์๐ญ๐ญ