๐ ๋ณธ ๊ธ์ 2022๋ 5์ 16์ผ ๊ฐ์ธ github์ ์์ฑ๋ ๊ธ์ ๋๋ค.
๐ useMemo, useCallback (+ React.memo + HOC)
โญ๏ธ 1์ฐจ ํ๋ก์ ํธ๊ฐ ๋๋๊ณ 2์ฐจ ํ๋ก์ ํธ์๋ ๋ฆฌ์กํธ์ ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ ๊ด๋ จํ hook์ ์ฌ์ฉํด๋ณด๊ฒ ๋ค! ๋ผ๋ ๋ค์ง์ ํ์๋๋ฐ, 2์ฐจ ํ๋ก์ ํธ๋ ๊ฑฐ์ ์ฌ์ฉํด๋ณด์ง ๋ชปํ๋ค.
๊ทธ ์ด์ ์ ๋ํด ์๊ฐํด๋ณด๋, ์ต์ํ์ง ์์ ๊ธฐ์ ์ ๋ํ ๋๋ ค์ ๋๋ฌธ์ด์๋ ๊ฒ ๊ฐ๋ค.
๊ณต๋ถ๋ฅผ ์ ๋๋ก ํ์ง ์์ ์ํ์๊ธฐ์ '๊ณผ์ฐ ์ ์ธ ์ ์์๊น', '๋๋ฌด ์ค๋ฒ์คํ์๋๊ฐ? ' , '์ด๋ ๊ฒ ํ๋ ๊ฒ์ด ๋ง๋? ' ํ๋ ๋๋ ค์๋ค๋ก
์ต์ ํ๋ฅผ ํ์ง ๋ชปํ ์ฑ 2์ฐจ ํ๋ก์ ํธ๊ฐ ๋ง๋ฌด๋ฆฌ ๋์๋ค. 3์ฐจ ํ๋ก์ ํธ์๋ ์ ๋๋ก ์ฌ์ฉํด๋ณด๊ธฐ ์ํด ๋ฏธ๋ฆฌ ๊ณต๋ถํ์!
useMemo, useCallback ์ ๋ํ์ฌ ์์๋ณด์!
# useMemo๋?
โ๏ธ ๊ณต์๋ฌธ์์ ์ ์ค๋ช
์ด ๋์ด์๋๋ฐ, ๋ฉ๋ชจ๋ฆฌ์ ์ด์
๋ ๊ฐ์ ๋ฐํํ๋ค๋ผ๋ ๋ฌธ์ฅ์ด ํต์ฌ์ด๋ค.
useMemo๋ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋์์ ๋์๋ง ๋ฉ๋ชจ์ด์ ์ด์
๋ ๊ฐ๋ง ๋ค์ ๊ณ์ฐํ๋ค๊ณ ํ๋ค.
์ฝ๊ฒ ๋งํด, ๋งจ ์ฒ์ ๊ฐ์ ์บ์ฑ์ ํด๋๊ณ ๋งค๋ฒ ๊ณ์ฐ์ ํ๋ ๊ฒ์ด ์๋๋ผ ์บ์ฑํ ๊ฐ์ ๊บผ๋ด์ ์ฌ์ฉํ๋ ๊ฒ!
โ ๏ธ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋๋ค๋ ๊ฒ -> ํธ์ถ๋๋ค๋ ๊ฒ -> ํธ์ถ์ด ๋ ๋๋ง๋ค ๋ชจ๋ ๋ด๋ถ ๋ณ์๊ฐ ์ด๊ธฐํ ๋๋ค!
์์
function Component() {
const value = calculate();
return <div>{value}</div>;
}
function calculate() {
return 10;
}
Component ๋ผ๋ ํจ์๊ฐ ๋๋๋ง๋ ๋๋ง๋ค value ๋ผ๋ ๋ณ์๋ ์ด๊ธฐํ๋๊ณ , calculate ํจ์๋ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถ๋๋ค..!! (๋งค์ฐ ๋นํจ์จ์ )
๐คฉ ํด๊ฒฐ
function Component() {
const value = useMemo(() => calculate(), []);
return <div>{value}</div>;
}
โ useMemo ๊ตฌ์กฐ
const value = useMemo(() => {
return calculate();
}), [];
โ๏ธ ์ฝ๋ฐฑํจ์ : ๋ฉ๋ชจ์ด์ ์ด์
ํ ๊ฐ์ ๊ณ์ฐํด์ return.
โ๏ธ ์์กด์ฑ ๋ฐฐ์ด: ๋ฐฐ์ด ์์ ์๋ ์์ ๊ฐ์ด ์
๋ฐ์ดํธ ๋ ๋๋ง ์ฝ๋ฐฑํจ์๋ฅผ ๋ค์ ํธ์ถํด์ ๋ฉ๋ชจ์ด์ ์ด์
ํ ๊ฐ์ ์
๋ฐ์ดํธํด์ค๋ค! ๋ง์ฝ ์์กด์ฑ ๋ฐฐ์ด์ด ๋น ๋ฐฐ์ด์ด๋ผ๋ฉด ์ฒ์์ ๋ง์ดํธ ๋ ๋๋ง! ์ดํ์๋ ๋ฉ๋ชจ์ด์ ์ด์
๋ ๊ฐ์ return!
useMemo๊ฐ ๋น์ ๋ฐํ๋ ๋ก์ง!
โญ๏ธimport React, { useEffect, useState } from 'react';
function Memo() {
const [number, setNumber] = useState(0);
const [isKorea, setIsKorea] = useState(true);
const location = useMemo(() => {
return {
country: isKorea ? 'ํ๊ตญ' : '์ธ๊ตญ',
};
}, [isKorea]);
// useMemo ๋ฅผ ํ์ฉํจ์ผ๋ก์จ, number ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ location ์ฌ๋ ๋๋ง์ ๋ง์์ ์๋ค.
useEffect(() => {
console.log('useEffect ํธ์ถ');
}, [location]);
return (
<div>
<h3>ํ๋ฃจ์ ๋ช๋ผ ๋์ฌ?</h3>
<input
type="number"
value={number}
onChange={(e) => setNumber(e.target.value)}
/>
<hr />
<h3>์ง๊ธ ์ด๋?</h3>
<p>๋๋ผ: {location.country}</p>
<button onClick={() => setIsKorea(!isKorea)}>๋นํ๊ธฐ ํ๊ณ ๊ฐ์~</button>
</div>
);
}
const location = isKorea ? 'ํ๊ตญ' : '์ธ๊ตญ';
์ด๋ location ๋ ์์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ number ๊ฐ์ด ๋ฐ๋์ด๋ useEffect๋ ์คํ๋์ง ์๋๋ค! number ๊ฐ์ด ๋ฐ๋ ๋ ๋ง๋ค location ์ ์ด๊ธฐํ๊ฐ ๊ณ์ ๋์ง๋ง, ๋๊ฐ์ string ์ ํ ๋น๋ฐ๊ธฐ ๋๋ฌธ์ useEffect ์คํ X. (useEffect ๋ ์์กด์ฑ ๋ฐฐ์ด์์ ์๋ ์์์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ์๋ง! ์คํ๋๋ค! )
const location = { country: isKorea ? 'ํ๊ตญ' : '์ธ๊ตญ' };
๊ฐ์ฒด์ผ๋๋ ์์ ๋ณต์ฌ! -> ๊ณ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋น๋๊ธฐ ๋๋ฌธ์ -> ๋งค๋ฒ useEffect ํจ์ ํธ์ถ!
๊ทธ๋ฐ๋ฐ useMemo ์ ์ธ ์ผ์ด ์๋ค...?
โconst memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
์ด๋ฏธ ๊ณต์๋ฌธ์ ์ฝ๋์์๋ computeExpensiveValue , ๋น์ผ์ฐ์ฐ์ผ๋ก ๊ธฐ์ฌ๋์ด์๋ค.
๊ทธ ์ด์ ๋ useMemo ๋ฅผ ๋จ์ฉํ๋ฉด ์คํ๋ ค ์ปดํฌ๋ํธ์ ๋ณต์ก๋๊ฐ ์ฌ๋ผ๊ฐ๊ณ , ์ฝ๋๋ ์ฝ๊ธฐ ์ด๋ ค์์ง๊ณ ์ ์ง๋ณด์์ฑ๋ ๋จ์ด์ง๊ณ , useMemo ๊ฐ ์ ์ฉ๋ ๋ ํผ๋ฐ์ค๋ ์ฌํ์ฉ์ ์ํด garbage collection ์์ ์ ์ธ๋๊ธฐ ๋๋ฌธ์ ์คํ๋ ค ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ด๋ค๊ณ ํ๋ค!
โญ๏ธ ์ฆ, useMemo ๋ฅผ ์ฐ๋๊ฒ ์ด๋์ธ์ง ์๋์ง ์ ํ๋จํด์ผํจ!
(+ garbage collection : JS ์์ง์์ ๊ณ์ ๋์์์ด ์๋ -> ๋ถํ์ํ ๊ฐ์ฒด ์๋ ์ญ์ )
์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ์์๋ useMemo๊ฐ ๋น์ ๋ฐํํ ์ ์๋ ์ํฉ์ ๊ทนํ ์ ํ์ ์ด๋ผ๊ณ ํ๋ค!
# useCallback๋?
โ๏ธ useCallback์ ํจ์ ์์ฒด๋ฅผ memoizationํ๋ hook์ด๋ค. (useMemo ์ ๊ฑฐ์ ๋น์ท -> ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ค๋ ์ฐจ์ด!)
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
์์
import { useCallback, useEffect, useState } from 'react';
import Box from './Box';
function Callback() {
const [size, setSize] = useState(100);
const [isDark, setIsDart] = useState(false);
const createBoxStyle = useCallback(() => {
return {
backgroundColor: 'pink',
width: `${size}px`,
height: `${size}px`,
};
}, [size]);
// createBoxStyle์ useCallback ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด์, isDark๊ฐ ๋๋๋ง๋ ๋, createBoxStyle ํจ์๊ฐ ์ฌ๋๋๋ง๋๋ ๊ฒ์ ๋ง์.
return (
<div style={{ background: isDark ? 'black' : 'white' }}>
<input
type="number"
value={size}
onChange={(e) => setSize(e.target.value)}
/>
<button onClick={() => setIsDart(!isDark)}>Change Theme</button>
<Box createBoxStyle={createBoxStyle} />
</div>
);
}
โ ๏ธ ์ ๊น!
useCallback ์ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ์๋ฏธ์๋ ์ฑ๋ฅ ํฅ์์ ํ ์ง ํ๋จํ๊ธฐ ์ํด์๋ ์ผ๋จ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์์ ๋๋ฑ์ฑ์ ๋ํด ์ ํ์๊ฐ ์๋ค๊ณ ํ๋ค!
const add1 = () => x + y;
// undefined
const add2 = () => x + y;
// undefined
console.log(add1 === add2);
//false
โญ๏ธ false ๊ฐ ๋์ค๋ ์ด์ ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ ๊ฐ์ฒด๋ก ์ทจ๊ธ๋๊ธฐ ๋๋ฌธ์ด๋ค!
๊ทธ๋ผ useCallback๋ useMemo ์ฒ๋ผ ์์ฃผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ธ๊ฐ...?
๐งuseCallback ์ useMemo ๋ณด๋ค๋ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฝค ์๋ค๊ณ ํ๋ค!
๋ค๋ง, ์ค์ํ ๊ฒ์ ์ฌ์ฉ์ ํ๊ธด ์ ์! ์ฑ๋ฅ ํ
์คํธ๋ฅผ ํด๋ณด๊ณ ์ฌ์ฉ์ด ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค๊ณ ํ๋ค!
# React.memo ?
(useCallback ์ ๋ํด ๊ณต๋ถํ๋ค๊ฐ ์๊ฒ ๋์๋ค! useCallback ๊ณผ ํจ๊ป ์์ฃผ ์ฐ์ธ๋ค๊ณ ํ๋ค.)
โ๏ธ React.memo๋ HOC ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ์ค HOC ๊ฐ ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅธ๋ค...๐ฅฒ ์ผ๋จ HOC ๋ถํฐ ๊ณต๋ถํด๋ณด์..
# HOC ....?
๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC, Higher Order Component)๋ ์ปดํฌ๋ํธ ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํ React์ ๊ณ ๊ธ ๊ธฐ์ ์ ๋๋ค. ๊ณ ์ฐจ ์ปดํฌ๋ํธ(HOC)๋ React API์ ์ผ๋ถ๊ฐ ์๋๋ฉฐ, React์ ๊ตฌ์ฑ์ ํน์ฑ์์ ๋์ค๋ ํจํด์ ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก, ๊ณ ์ฐจ ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ฐํํ๋ ํจ์์ ๋๋ค.
๊ณต์๋ฌธ์์ ์ค๋ช ์ด๋ค.
์ฌ์ค ์ ์ดํด๊ฐ ๋์ง ์์์, ๋ค๋ฅธ ์ค๋ช
์ ์ฐพ์๋ณด๋ ์ค ๊ณ ์ฐจํจ์์ ๊ฑฐ์ ์ ์ฌํ๋ค๋ ๊ธ์ ๋ฐ๊ฒฌํ๋ค..!!
๊ณ ์ฐจํจ์๋ ๋ค๋ฅธ ํจ์๋ฅผ ์ ๋ฌ์ธ์๋ก ๋ฐ๊ฑฐ๋, ํจ์ ์คํ์ ๊ฒฐ๊ณผ๋ฅผ ํจ์๋ก ๋ฐํ ํจ์๋ฅผ ๋งํ๋๋ฐ, ๋ํ์ ์ธ ์์๋ก ์์ฃผ ์ฌ์ฉํ๋ ๋ฉ์๋์ธ map() ๊ฐ ์๋ค.
const nums = [1, 2, 3];
const addNums = nums.map((num) => num + 5);
// ์ฝ๋ฐฑ ํจ์์์์ ์คํ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๋ง๋ค์ด ๋ฐํํจ.
console.log(addNums); // [6, 7, 8]
์ด๋ค ๋๋์ธ์ง...๊ฐ์ด ์์ฃผ ์ด์ง ์ค๋ ๋ค์ ๊ณ ์ฐจ์ปดํฌ๋ํธ๋ก ๋์์ค์.
const EnhancedComponent = higherOrderComponent(WrappedComponent);
์์ ์ฝ๋์์ higherOrderComponent ๋ ๊ณ ์ฐจ ์ปดํฌ๋ํธ, WrappedComponent ๋ ์ผ๋ฐ ์ปดํฌ๋ํธ์ด๋ค.
EnhancedComponent ๋ ๋ง ๊ทธ๋๋ก ๊ณ ์ฐจ ์ปดํฌ๋ํธ๊ฐ ๋ฐํํ ํฅ์๋ ์ปดํฌ๋ํธ!
function withProps(Comp, props) {
// HOC ์ด๋ฆ ๊ท์น : with_
return function (ownProps) {
return <Comp {...props} {...ownProps} />;
};
}
function Hello(props) {
return (
<div>
Hello, {props.name}. I am {props.myName}
</div>
);
}
const HelloJohn = withProps(Hello, { name: 'John' });
const App = () => (
<div>
<HelloJohn myName="Kim" />
<HelloJohn myName="Lee" />
</div>
);
์์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ดํด๊ฐ ๋์์ง๋ง, ํ์คํ์ง ์๋ค. ์ง์ ์ฌ์ฉํด๋ณด์ง๋ ์์์..์ง์ ์ฌ์ฉํด๋ณด๋ฉด ๋ ๋ค๋ฅธ ๋๋์ผ ๊ฒ ๊ฐ๋ค.
์ผ๋จ ์ค๋ ๊ธ์์ HOC ์ค๋ช
์ ์ด์ ๋๋ก๋ง ํ๊ณ ์ถํ์ !!! ๊ผญ ๋ณด์ถฉ ํ ๊ฒ์ด๋ค!!
# ๋ค์ ๋์์์ React.memo ์ ๋ํด ์์๋ณด์.
React.memo ๋ HOC ์ด๋ค. ๋ฅผ ์ฝ๊ณ ์ ์ HOC ์ ๋ํด ์ ๋ฆฌํ์๋ค...
๋ค์ ๋์์ค์!
โ ๊ฐ๋จํ ์ฌ์ฉ๋ฐฉ๋ฒ
export default React.memo(MyComponents);
or
export const updateMyComponents = React.memo(MyComponents);
React.memo ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ ๋ค์, ์ด์ ์ ๋ ๋๋ ๊ฒฐ๊ณผ์ ๋น๊ตํ์ฌ DOM ์
๋ฐ์ดํธ๋ฅผ ๊ฒฐ์ ํ๋ค!
์ฆ ์ปดํฌ๋ํธ๊ฐ React.memo ๋ก ๋ํ๋๋ค๋ฉด, ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ์ด์ง -> ๋ค์ ๋ ๋๋ง์ด ์ผ์ด๋ ๋ props๊ฐ ๊ฐ๋ค๋ฉด ๋ฉ๋ชจ์ด์งํ ๋ด์ฉ์ ์ฌ์ฌ์ฉํ๋ค!
# React.memo ๋น๊ต ๋ฐฉ๋ฒ ์์ ๊ฐ๋ฅํ๋ค!
useMemo, useCallback ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, props ํน์ props์ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ ๋ ์์ ๋น๊ต ๋ฅผ ํ๋ค! ์ด๋ฏธ useCallback ์์ ์ธ๊ธ๋์์ง๋ง, ํจ์๋ ๊ฐ์ฒด๋ก ์ทจ๊ธ๋๊ธฐ ๋๋ฌธ์ด๋ค!
๋์ React.memo ๋ ๋น๊ต ๋ฐฉ์์ ์์ ํ ์ ์๋ค! ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ๋น๊ตํจ์๋ฅผ ๋ง๋ค์ด ๋๊ฒจ์ฃผ๋ฉด ๋๋ค..!!
function MyComponents(props) {}
function areEqual(prevProps, nextProps) {
/*
nextProp๊ฐ prevProps์ ๋์ผํ ๊ฐ -> true, ๋ค๋ฅด๋ค๋ฉด -> false
*/
}
export default React.memo([MyComponents, areEqual]);
โ ๏ธ ์ฝ๋ฐฑํจ์ ์ฃผ์ํ์!
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํผ๋ํธ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ํ๋ค๋ฉด, ์ ํจ์๊ฐ ์์์ ์ผ๋ก ์์ฑ๋ ์ ์๋ค๊ณ ํ๋ค!
์ฐธ๊ณ ํ ๋ธ๋ก๊ทธ์ ๊ธฐ์ฌ๋ ์ค๋ช
์ ํตํด ์ดํดํด๋ณด์!
function Logout({ username, onLogout }) {
return <div onClick={onLogout}>Logout {username}</div>;
}
const MemoizedLogout = React.memo(Logout);
function MyApp({ store, cookies }) {
return (
<div className="main">
<header>
<MemoizedLogout
username={store.username}
onLogout={() => cookies.clear()}
/>
</header>
{store.content}
</div>
);
}
๋์ผํ username ๊ฐ์ด ์ ๋ฌ๋๋๋ผ๋, MemoizedLogout์ ์๋ก์ด onLogout ์ฝ๋ฐฑ ๋๋ฌธ์ ๋ฆฌ๋ ๋๋ง์ ํ๊ฒ ๋๋ค.
-> ์ฆ ๋ฉ๋ชจ์ด์ ์ด์
์ค๋จ!
ํด๊ฒฐ๋ฐฉ๋ฒ์ onLogout prop์ ๊ฐ์ ๋งค๋ฒ ๋์ผํ ์ฝ๋ฐฑ ์ธ์คํด์ค๋ก ์ค์ ํ์ฌ ๋๋ค! -> ์ด๋ useCallback ์ฌ์ฉ!
const MemoizedLogout = React.memo(Logout);
function MyApp({ store, cookies }) {
const onLogout = useCallback(() => {
cookies.clear();
}, []);
return (
<div className="main">
<header>
<MemoizedLogout username={store.username} onLogout={onLogout} />
</header>
{store.content}
</div>
);
}
# useCallback, React.memo
useCallback๋ง ์ฌ์ฉํ๋ฉด ํ์์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ ๋ง์ ์ ์๊ธฐ ๋๋ฌธ์ React.memo ๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๊ณ ,
React.memo๋ง ์ฌ์ฉํ๋ฉด, ๋ถ๋ชจ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ํ๋ฉด, ์ด๋ก ์ธํด ๋ฉ๋ชจ์ด์ ์ด์
์ด ์ค๋จ๋ ์ ์๊ธฐ๋๋ฌธ์ useCallback ์ ์ฌ์ฉํ๋ค๊ณ ์ดํดํ์๋ค..!! (์ถํ์ ๋ณด์ถฉ์ฌํญ์ด ์์ผ๋ฉด ์
๋ฐ์ดํธ ํ ์์ ! )
# ๋ง์ง๋ง์ผ๋ก React.memo ์ธ์ ์ฐ๋ฉด ์ข์๊น?
๊ฐ์ props ์์ฃผ ๋ ๋๋ง์ด ์ผ์ด๋๋ ์ปดํฌ๋ํธ๋ค!
โญ๏ธ ํ์ง๋ง ์ค์ํ ๊ฒ์ ์์์๋ ๊ณ์ ์ธ๊ธ์ด ๋์์ง๋ง, ์ฌ์ฉํ์ ๋์ ์ฌ์ฉํ์ง ์์์ ๋์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ๋น๊ตํ ํ, ์ด๋์ด ์์ ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค!!
# ๋๋์
useMemo ์ useCallback ์ ๋ํด์ ๊ฐ๋จํ ์ ๋ฆฌํ ๋ ค๊ณ ์์ํ ๊ธ์ด, HOC, React.memo ๋ก ๋ง๋ฌด๋ฆฌ ๋์๋ค.
ํญ์ !! ๋งค๋ฒ ๋๋ผ์ง๋ง,,, ๊ณต๋ถํ๋ค๋ณด๋ฉด ์๋ก์ด ๊ณณ์์ ๋ ๋ค๋ฅธ ๊ณต๋ถํด์ผํ๋ ๊ฒ๋ค์ด ์๊ธฐ๊ณ ...๋ ๊ณต๋ถํ๋ฉด ๋ ์๊ธฐ๊ณ ...์ด๋ ต๋ค...๐ฅฒ
ํ์ง๋ง ํํธ์ผ๋ก ์ฌ๋ฏธ๋ ์๋ค...!! ๋ค๋ง, ๊ฐ๋
์ ์๋ค๊ณ ํด์ ๋ค ์๋ ๊ฒ์ด ์๋๋...์ฌ์ฉํ ๊ธฐํ๊ฐ ์๊ธด๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์ฌ์ฉํด๋ณด์!
๐ Reference
https://merrily-code.tistory.com/11
https://ui.toast.com/weekly-pick/ko_20190731
https://crmrelease.tistory.com/41
https://satisfactoryplace.tistory.com/163
https://sustainable-dev.tistory.com/137
https://www.daleseo.com/react-hooks-use-memo/
https://www.youtube.com/watch?v=XfUF9qLa3mU https://www.youtube.com/watch?v=e-CnI8Q5RY4
'๐ WIL > ๐ React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐งฌ Atomic ๋์์ธ์ ์ ์ฉํด๋ณด์. (0) | 2022.08.13 |
---|---|
โ๏ธ useRef (0) | 2022.08.10 |
๐ก useContext ๋ฅผ ๋ง์ด ์ฐ๋ฉด ์๋๋ค...? (0) | 2022.08.10 |
๐ก Spread Syntax๋ฅผ ์ ์ฌ์ฉํ ๊น..? (0) | 2022.08.10 |
SSR ๊ณผ CSR, ๊ทธ๋ฆฌ๊ณ SEO (0) | 2022.08.10 |