useCallback
ํจ์๋ฅผ memoizationํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ hookํจ์ → useMemo์ ๋น์ทํ Hook
๐ก useMemo๋ ํน์ ๊ฒฐ๊ณผ๊ฐ์ ์ฌ์ฌ์ฉ ํ ๋ ์ฌ์ฉ
useCallback์ ํน์ ํจ์๋ฅผ ์๋ก ๋ง๋ค์ง ์๊ณ ์ฌ์ฌ์ฉํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
- ์ปดํฌ๋ํธ์์ props๊ฐ ๋ฐ๋์ง ์์ผ๋ฉด Virtual DOM์ ์๋ก ๋ ๋๋งํ๋ ๊ฒ๋ ํ์ง ์๊ณ , ์ปดํฌ๋ํธ์ ๊ฒฐ๊ณผ๋ฌผ์ ์ฌ์ฌ์ฉํ๋ ์ต์ ํ ์์ → ํจ์ ์ฌ์ฌ์ฉ
๊ธฐ๋ณธ ๊ตฌ์กฐ
const memoizedCallback = useCallback(ํจ์, ๋ฐฐ์ด);
์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ: ์ธ์๋ก ๋์ด์จ ํจ์
๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ: ๋์ด์จ ๋ฐฐ์ด ๋ด์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋๊น์ง ์ ์ฅํด๋๊ณ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ํด์ค
- ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋์ด๋ ๊ทธ ํจ์๊ฐ ์์กดํ๋ ๊ฐ๋ค์ด ๋ฐ๋์ง ์๋ ํ ๊ธฐ์กด ํจ์ ๊ณ์ ๋ฐํ
const add = () => x+y;
const add = useCallback(() => x+y, [x,y]);
// x ๋๋ y ๊ฐ์ด ๋ฐ๋๋ฉด ์๋ก์ด ํจ์๊ฐ ์์ฑ๋์ด add๋ณ์์ ํ ๋น๋๊ณ , x์ y๊ฐ์ด ๋์ผํ๋ค๋ฉด
// ๋ค์ ๋ ๋๋ง ๋ ํจ์ ์ฌ์ฌ์ฉ
import React, { useRef, useState, useMemo, useCallback } from "react";
const onChange = useCallback(
(e) => {
const { name, value } = e.target;
setInputs({
...inputs,
[name]: value,
});
},
[inputs]
);
const onCreate = useCallback(() => {
const user = {
id: nextId.current,
username,
email,
};
setUsers(users.concat(user));
setInputs({
username: "",
email: "",
});
nextId.current += 1; //๊ฐ ์์ ์, .current ๊ฐ ์์ ํ๋ฉด ๋๊ณ , ์กฐํํ ๋๋ .current์กฐํํ๋ฉด ๋จ
}, [users, username, email]);
const onRemove = useCallback(
(id) => {
//user.id๊ฐ ํ๋ผ๋ฏธํฐ๋ก ์ผ์นํ์ง ์๋ ์์๋ง ์ถ์ถํ์ฌ ์๋ก์ด ๋ฐฐ์ด์ ๋ง๋ฆ
//=user.id๊ฐ id์ธ ๊ฒ์ ์ ๊ฑฐ
setUsers(users.filter((user) => user.id !== id));
},
[users]
);
const onToggle = useCallback(
(id) => {
setUsers(
users.map((user) =>
user.id === id ? { ...user, active: !user.active } : user
)
);
},
[users]
);
โ๏ธ ํจ์ ์์์ ์ฌ์ฉํ๋ ์ํ ํน์ props๊ฐ ์๋ค๋ฉด deps ๋ฐฐ์ด ์์ ํฌํจ์์ผ์ผ ํจ
→ ๋ง์ฝ deps ๋ฐฐ์ด ์์ ํด๋น ๊ฐ์ ๋ฃ์ง ์์ผ๋ฉด, ํจ์ ๋ด์์ ํด๋น ๊ฐ๋ค์ ์ฐธ์กฐํ ๋ ๊ฐ์ฅ ์ต์ ๊ฐ์ ์ฐธ์กฐํ๋ค๊ณ ๋ณด์ฅ ๋ชปํจ
โ๏ธ props๋ก ๋ฐ์์จ ํจ์ ์์ผ๋ฉด, ์ด ํจ์๋ deps์ ๋ฃ์ด์ผ ํจ
useCallback์ useMemo ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง
const onToggle = useMemo(
() => () => {
/* ... */
},
[users]
);
→ useCallback์ ์ฌ์ฉํ์์ ๋, ๋์ ๋๋ ์ต์ ํ๋ ์์ → ์ปดํฌ๋ํธ ๋ ๋๋ง ์ต์ ํ ์์ ํด์ฃผ์ด์ผ ์ฑ๋ฅ์ด ์ต์ ํ ๋จ(React DevTools: ์ด๋ค ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํ ํ๋ก๊ทธ๋จ)
React.memo๋ฅผ ์ฌ์ฉํ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง ๋ฐฉ์ง
์ปดํฌ๋ํธ์ props๊ฐ ๋ฐ๋์ง ์์์ ๋, ๋ฆฌ๋ ๋๋ง ๋ฐฉ์งํ์ฌ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ ํด์ฃผ๋ ํจ์ → ์ปดํฌ๋ํธ์์ ๋ฆฌ๋ ๋๋ง์ด ํ์ํ ์ํฉ์์๋ง ๋ฆฌ๋ ๋๋ง ํ๋๋ก ์ค์
์ฌ์ฉ๋ฒ
export default React.memo(UserList); //์ปดํฌ๋ํธ ์ด๋ฆ์ React.memo๋ก ๊ฐ์ธ์ฃผ๋ฉด ๋จ
React.memo์์ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ propsAreEqual ์ด๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๊ฐ๋ค๋ง ๋น๊ต ๊ฐ๋ฅ → ์๋ชป ์ฌ์ฉํ๋ฉด ์๋์น ์์ ๋ฒ๊ทธ ๋ฐ์ํ๊ธฐ ์ฌ์
export default React.memo(
UserList,
(prevProps, nextProps) => prevProps.users === nextProps.users
);
์ฃผ์ํ ์
useMemo, useCallback, React.memo๋ ์ปดํฌ๋ํธ ์ฑ๋ฅ์ ์ค์ ๋ก ๊ฐ์ ํ ์ ์๋ ์ํฉ์์๋ง ์ฌ์ฉํ๊ธธ ๊ถ์ฅ
ex) ๋ ๋๋ง ์ต์ ํ ํ์ง ์์ ์ปดํฌ๋ํธ์ React.memo๋ฅผ ์ฌ์ฉํ๋๊ฒ์ ๋ถํ์ํ props ๋น๊ตํ๋ ๊ฒ์
'ํ๋ก ํธ์๋ > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์ปค์คํ Hooks ๋ง๋ค๊ธฐ (0) | 2022.11.24 |
|---|---|
| useReducer (0) | 2022.11.24 |
| useEffect์ useMemo (0) | 2022.11.23 |
| ์ปดํฌ๋ํธ ๋ ๋๋ง (0) | 2022.11.23 |
| โ ๋ฐฐ์ด ๋ด์ฅ ํจ์(์๋ฐ์คํฌ๋ฆฝํธ) (0) | 2022.11.17 |