์ฐธ๊ณ ์ฌ์ดํธ
• ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์ - useCallback
• ๋ณ์ฝ๋ฉ๋์ youtube - useCallback ๊ฐ์
๐ชฃ useCallback
useCallback์ ์ฌ๋ ๋๋ง ์ฌ์ด์ ํจ์ ์ ์๋ฅผ ์บ์ํ ์ ์๋ React Hook์ด๋ค.
๐ข ์ฐธ์กฐ
useCallback ์ฌ๋ ๋๋ง ์ฌ์ด์ ํจ์ ์ ์๋ฅผ ์บ์ํ๋ ค๋ฉด ๊ตฌ์ฑ ์์์ ์ต์์ ์์ค์์ ํธ์ถํ๋ฉด ๋๋ค.
const cachedFn = useCallback(fn, [dependencies]);
๐ฆ Parameters
• fn: ์บ์ํ๋ ค๋ ํจ์์ด๋ค. ๋ชจ๋ ์ธ์๋ฅผ ์ทจํ๊ณ ๋ชจ๋ ๊ฐ์ ๋ฐํํ ์ ์๋ค.
React๋ ์ด๊ธฐ ๋ ๋๋ง ์ค์ ํจ์๋ฅผ ๋ค์ ๋ฐํํ๋ค(ํธ์ถX). ๋ค์ ๋ ๋๋ง์์ dependencies๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒฝ์ฐ ๋์ผํ ๊ธฐ๋ฅ์ ๋ค์ ์ ๊ณตํ๋ฉฐ, ๊ทธ๋ ์ง ์๋ค๋ฉด ์ด์ ๋ ๋๋ง์ ์ ๋ฌํ ํจ์๋ฅผ ์ ๊ณตํ๊ณ ๋ค์ ์ฌ์ฉํ ์ ์๋๋ก ์ ์ฅํ๋ค.
• dependencies: fn ์ฝ๋ ๋ด๋ถ์์ ์ฐธ์กฐ๋๋ ๋ชจ๋ ๋ฐ์ ๊ฐ์ ๋ชฉ๋ก์ด๋ค. props, state๋ฐ ๊ตฌ์ฑ ์์ ๋ณธ์ฒด ๋ด๋ถ์ ์ง์ ์ ์ธ๋ ๋ชจ๋ ๋ณ์์ ํจ์๊ฐ ๋ค์ด๊ฐ ์ ์๋ค.
๐ Return
useCallback() Hook์ ์ด๊ธฐ ๋ ๋๋ง ์, ์ ๋ฌํ ํจ์ fn๋ฅผ ๋ฐํํ๋ค.
์ข ์์ฑ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ ๋๋ง ์ค์ ์ ๋ฌ๋ ํจ์๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ง์ง๋ง ๋ ๋๋ง์์ ์ ์ฅ๋ ํจ์๋ฅผ ๋ฐํํ๋ค.
โ ๏ธ ์ฃผ์์ฌํญ
• useCallback์ Hook์ด๋ฏ๋ก ์ปดํฌ๋ํธ ์ต์์ ์์ค ๋๋ ์์ฒด Hook์์๋ง ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
• React๋ ํน๋ณํ ์ด์ ๊ฐ ์๋ ํ ์บ์๋ ํจ์๋ฅผ ๋ฒ๋ฆฌ์ง ์์ต๋๋ค.
โ๏ธ ์ฌ์ฉ
• ๊ตฌ์ฑ ์์ ๋ค์ ๋ ๋๋ง ๊ฑด๋๋ฐ๊ธฐ
๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํํ ๋ ํ์ ๊ตฌ์ฑ ์์์ ์ ๋ฌํ๋ ๊ธฐ๋ฅ์ ์บ์ํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
๐App.tsx
import React, {
useCallback,
useState,
} from "react";
import "./App.css";
import { Box } from "./Box";
function App() {
const [size, setSize] = useState<number>(50);
const [isDark, setIsDark] = useState(false);
// const createBoxStyle = () => {
// return {
// backgroundColor: "skyblue",
// width: `${size}px`,
// height: `${size}px`,
// };
// };
const createBoxStyle = useCallback(() => {
return {
backgroundColor: "skyblue",
width: `${size}px`,
height: `${size}px`,
};
}, [size]);
return (
<>
<div style={{ background: isDark ? "black" : "white" }}>
<input
type="number"
value={size}
onChange={(e) => {
setSize(parseInt(e.target.value));
}}
/>
<button
onClick={(e) => {
setIsDark(!isDark);
}}
>
Change Theme
</button>
<Box createBoxStyle={createBoxStyle}></Box>
</div>
</>
);
}
export default App;
๋ผ์ธ 12. useCallback์ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋๋ง ์ ๊ณ์ ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.
"Change Theme"๋ฒํผ์ ํตํด isDark์ ๊ฐ์ ๋ฐ๊พธ์ด๋ ๋ถํ์ํ๊ฒ ํธ์ถ๋๋๋ฐ ์ด๋, useCallback์ ํตํด size๊ฐ์ด ๋ณ๊ฒฝ ๋ ๋๋ง ํจ์๊ฐ ํธ์ถ๋๋๋ก ํ๋ค๋ฉด ์ฑ๋ฅ ์ ํ๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ๋ฐฉ์งํ ์ ์๋ค.
<Box/> ํ๊ทธ์ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
๐ Box.tsx
import { useEffect, useState } from "react";
type boxStyle = {
backgroundColor: string;
width: number;
height: number;
};
export const Box = ({ createBoxStyle }: any) => {
const [style, setStyle] = useState<boxStyle>();
useEffect(() => {
console.log("๋ฐ์ค ํค์ฐ๊ธฐ");
setStyle(createBoxStyle());
}, [createBoxStyle]);
return <div style={style}></div>;
};
createBoxStyle์ ๊ฐ์ ธ์์ ๋ฐ๋ ๋๋ง๋ค log๋ฅผ ์ฐ๊ณ , State๊ฐ ๋ณ๊ฒฝ๋์์ผ๋ฏ๋ก ํด๋น Box์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํ๋ค.
useCallback()์ด ์ ์ฉ๋ ํจ์์ ๊ทธ๋ ์ง ์์ ํจ์๋ฅผ ์ ์ฉํด๊ฐ๋ฉฐ log๋ฅผ ํ์ธํด๋ณด์.
'Framework > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ React ] Custom Hook์ผ๋ก ๋ก์ง์ ์ฌ์ฌ์ฉํด๋ณด์. (0) | 2024.04.15 |
---|---|
[ React ] useContext์ ๋ํด ์์๋ณด์. (2) | 2024.04.08 |
[ React ] useMemo์ ๋ํด ์์๋ณด์. (0) | 2024.04.04 |
[ React ] useRef์ ๋ํด ์์๋ณด์. (0) | 2024.04.04 |
[ React ] useEffect()๋ฅผ ์ฌ์ฉํด๋ณด์. (feat. TypeScript) (0) | 2024.03.11 |