Memoization
- Memoize value ->
React.useMemo()
- Memoize function ->
React.useCallback()
- Memoize component ->
React.memo()
- References
useMemo
function FactorialDisplay({ num }) {
const computeFactorial = (n) => {
console.log('Computing factorial...');
if (n <= 1) return 1;
return n * computeFactorial(n - 1);
};
const factorial = useMemo(() => computeFactorial(num), [num]);
return (
<div>
<p>Factorial of {num} is {factorial}</p>
</div>
);
}
useCallback
- memoize a function, returning the same function instance unless one of its dependencies has changed
- useful for passing stable callback functions to child components, which can help prevent unnecessary re-renders
memo
- lets you skip re-rendering a component when its props are unchanged
- Syntax:
const MemoizedComponent = memo(SomeComponent, arePropsEqual?)
- Example:
<Greeting/> gets rendered only when name is entered
function MyApp() {
const [name, setName] = useState('');
const [address, setAddress] = useState('');
return (
<>
<label>
Name{': '}
<input value={name} onChange={e => setName(e.target.value)} />
</label>
<label>
Address{': '}
<input value={address} onChange={e => setAddress(e.target.value)} />
</label>
<Greeting name={name} />
</>
);
}
const Greeting = memo(function Greeting({ name }) {
console.log("Greeting was rendered at", new Date().toLocaleTimeString());
return <h3>Hello{name && ', '}{name}!</h3>;
});
useMemo vs useState+useEffect