๋ชฉ๋ก
- Introduction
- React.memo
- Conclusion
๐ Introduction
์๋ ํ์ธ์. ์ด๋ฒ ํฌ์คํ ์์๋ ์ง๋ ์๊ฐ์ ์ธ๊ธ ํ์๋ React.memo์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ปดํฌ๋ํธ์ ๋๋๋ง์ด ๋ถํ์ํ ๋ ์ธ์ ์์ด์. ์ปดํฌ๋ํธ ๋ฆฌ๋๋๋ง์ ์ต์ ํ ํ ์ ์์ต๋๋ค. ํ๋ฒ ์์ธํ๊ฒ ์์๋ณผ๊ฒ์.
๐ React.memo
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.
export default๋ฅผ ํด์ค๋ ๊ฐ์ธ์ฃผ์๋ฉด ๋์.
export default React.memo(CreateUser);
ํน์ ์ด๋ ๊ฒ๋ ๊ฐ๋ฅํด์.
// ์ด๋ ๊ฒ ์๊ธด ์์ด๋ฅผ
function User() {
// ...
}
// ์ด๋ ๊ฒ ๋ณ๊ฒฝ์ด ๊ฐ์ธ์ค์ ์์ด์
const User = React.memo(function User(){
// ...
});
์ด๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋์์๋๋ง ๋ฆฌ๋๋๋ง์ด ๋ฉ๋๋ค. ๋ํ React.memo์์๋ ๋๋ฒ์งธ ์ธ์๋ก propsAreEqual์ ๋ฐ์ ์ ์์ด์. ๋ง์ฝ propsAreEqual์ true
๊ฐ ๋ฐํ์ด ๋๋ค๋ฉด re rendering์ ๋ฐฉ์งํ๊ณ false
๊ฐ ๋ฐํ ๋๋ค๋ฉด re rendering์ ํด์ฃผ๊ฒ ๋์ด์์ต๋๋ค. ์ฝ๋๋ก ํ๋ฒ ๋ณผ๊ฒ์.
export default React.memo(
UserList,
(prevProps, nextProps) => prevProps.users === nextProps.users
);
์ฒซ๋ฒ์งธ ์ธ์๋ก๋ ์ ์ props๋ฅผ ๋ฐ์์ค๊ฒ ๋๊ณ ๋๋ฒ์งธ ์ธ์๋ก๋ ๋ค์ props๋ฅผ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ users๊ฐ ๋ง์ฝ ์ ๊ณผ ํ๊ฐ ์ผ์น ํ๋ค๋ฉด re rendering์ ๋ฐฉ์งํด์ค์ ์์ด์.
์ถ๊ฐ์ ์ผ๋ก ์กฐ๊ธ๋ ์ต์ ํ๋ฅผ ์์ผ๋ณด์๋ฉด ์ ํฌ์คํ ์์์ onToggle์ ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const onToggle = useCallback(
(userId) => {
setUsers(
users.map((user) =>
user.id === userId ? { ...user, active: !user.active } : user
)
);
},
[users]
);
์ด๋ ๊ฒ ์๊ธด ์์ด๋ฅผ setUsers์ dep๋ฅผ ์ง์์ค์ ์์ด์.
const onToggle = useCallback((userId) => {
setUsers((users) =>
users.map((user) =>
user.id === userId ? { ...user, active: !user.active } : user
)
);
}, []);
์ด๋ ๊ฒ ํด์ค๋ค๋ฉด ์ด์ deps๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ณ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ์ฃ ?
๐ Conclusion
์ด๋ ๊ฒ React.memo์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ์์ 2 ํฌ์คํ ๋ ์ต์ ํ์ ๊ดํ ๋ด์ฉ์ด์์ง๋ง ๊ทธ์ค์ ๊ฐ์ฅ ์ฑ๋ฅ์ ์ต์ ํ ์ํฌ์ ์์ต๋๋ค. ํ์ง๋ง React.memo, useCallback, useMemo์ ๊ฐ์ ๊ฒ๋ค์ ๋จ๋ฐํ๊ฒ ๋๋ฉด ์คํ๋ ค ์ฝ๋๋ฅผ ๋ง์ด ์คํํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ์๋ ์์ด์. ๊ทธ๋ฌ๋ ๊ผญ ํ์ํ ์๊ฐ์ ์ต์ ํ๋ฅผ ์งํํด์ฃผ์๋ฉด ์ข์๊ฑฐ ๊ฐ์์. ๊ทธ๋ผ ๋ค์ ํฌ์คํ ์์ ๋ง๋์ ์๋ !
'React Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React - custom hook (0) | 2020.12.13 |
---|---|
React - useReducer (0) | 2020.12.13 |
React - useCallback (0) | 2020.12.07 |
React - useMemo (0) | 2020.12.06 |
React - useEffect (0) | 2020.12.05 |
๋ชฉ๋ก
- Introduction
- React.memo
- Conclusion
๐ Introduction
์๋ ํ์ธ์. ์ด๋ฒ ํฌ์คํ ์์๋ ์ง๋ ์๊ฐ์ ์ธ๊ธ ํ์๋ React.memo์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค. ์ปดํฌ๋ํธ์ ๋๋๋ง์ด ๋ถํ์ํ ๋ ์ธ์ ์์ด์. ์ปดํฌ๋ํธ ๋ฆฌ๋๋๋ง์ ์ต์ ํ ํ ์ ์์ต๋๋ค. ํ๋ฒ ์์ธํ๊ฒ ์์๋ณผ๊ฒ์.
๐ React.memo
์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.
export default๋ฅผ ํด์ค๋ ๊ฐ์ธ์ฃผ์๋ฉด ๋์.
export default React.memo(CreateUser);
ํน์ ์ด๋ ๊ฒ๋ ๊ฐ๋ฅํด์.
// ์ด๋ ๊ฒ ์๊ธด ์์ด๋ฅผ
function User() {
// ...
}
// ์ด๋ ๊ฒ ๋ณ๊ฒฝ์ด ๊ฐ์ธ์ค์ ์์ด์
const User = React.memo(function User(){
// ...
});
์ด๋ ๊ฒ ํ๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋์์๋๋ง ๋ฆฌ๋๋๋ง์ด ๋ฉ๋๋ค. ๋ํ React.memo์์๋ ๋๋ฒ์งธ ์ธ์๋ก propsAreEqual์ ๋ฐ์ ์ ์์ด์. ๋ง์ฝ propsAreEqual์ true
๊ฐ ๋ฐํ์ด ๋๋ค๋ฉด re rendering์ ๋ฐฉ์งํ๊ณ false
๊ฐ ๋ฐํ ๋๋ค๋ฉด re rendering์ ํด์ฃผ๊ฒ ๋์ด์์ต๋๋ค. ์ฝ๋๋ก ํ๋ฒ ๋ณผ๊ฒ์.
export default React.memo(
UserList,
(prevProps, nextProps) => prevProps.users === nextProps.users
);
์ฒซ๋ฒ์งธ ์ธ์๋ก๋ ์ ์ props๋ฅผ ๋ฐ์์ค๊ฒ ๋๊ณ ๋๋ฒ์งธ ์ธ์๋ก๋ ๋ค์ props๋ฅผ ๋ฐ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ users๊ฐ ๋ง์ฝ ์ ๊ณผ ํ๊ฐ ์ผ์น ํ๋ค๋ฉด re rendering์ ๋ฐฉ์งํด์ค์ ์์ด์.
์ถ๊ฐ์ ์ผ๋ก ์กฐ๊ธ๋ ์ต์ ํ๋ฅผ ์์ผ๋ณด์๋ฉด ์ ํฌ์คํ ์์์ onToggle์ ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
const onToggle = useCallback(
(userId) => {
setUsers(
users.map((user) =>
user.id === userId ? { ...user, active: !user.active } : user
)
);
},
[users]
);
์ด๋ ๊ฒ ์๊ธด ์์ด๋ฅผ setUsers์ dep๋ฅผ ์ง์์ค์ ์์ด์.
const onToggle = useCallback((userId) => {
setUsers((users) =>
users.map((user) =>
user.id === userId ? { ...user, active: !user.active } : user
)
);
}, []);
์ด๋ ๊ฒ ํด์ค๋ค๋ฉด ์ด์ deps๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ณ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ์ฃ ?
๐ Conclusion
์ด๋ ๊ฒ React.memo์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ์์ 2 ํฌ์คํ ๋ ์ต์ ํ์ ๊ดํ ๋ด์ฉ์ด์์ง๋ง ๊ทธ์ค์ ๊ฐ์ฅ ์ฑ๋ฅ์ ์ต์ ํ ์ํฌ์ ์์ต๋๋ค. ํ์ง๋ง React.memo, useCallback, useMemo์ ๊ฐ์ ๊ฒ๋ค์ ๋จ๋ฐํ๊ฒ ๋๋ฉด ์คํ๋ ค ์ฝ๋๋ฅผ ๋ง์ด ์คํํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ์๋ ์์ด์. ๊ทธ๋ฌ๋ ๊ผญ ํ์ํ ์๊ฐ์ ์ต์ ํ๋ฅผ ์งํํด์ฃผ์๋ฉด ์ข์๊ฑฐ ๊ฐ์์. ๊ทธ๋ผ ๋ค์ ํฌ์คํ ์์ ๋ง๋์ ์๋ !
'React Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React - custom hook (0) | 2020.12.13 |
---|---|
React - useReducer (0) | 2020.12.13 |
React - useCallback (0) | 2020.12.07 |
React - useMemo (0) | 2020.12.06 |
React - useEffect (0) | 2020.12.05 |