Caches the result of a calculation between re-renders. It only re-calculates when dependencies change.
Here, expensiveCalculation runs on every render, even if you just toggle a checkbox or type in an unrelated input.
function App() {
const [num, setNum] = useState(1);
const [dark, setDark] = useState(false);
// 🐌 Runs on EVERY render. Slow!
const double = expensiveCalculation(num);
return (
<>
<input value={num} onChange={e => setNum(e.target.value)} />
<button onClick={() => setDark(!dark)}>Toggle Theme</button>
<div>Result: {double}</div>
</>
);
}Wrap the calculation in useMemo. Now it only runs when num changes. Toggling the theme is instantaneous again!
import { useMemo } from 'react';
function App() {
const [num, setNum] = useState(1);
const [dark, setDark] = useState(false);
// 🚀 Only runs if 'num' changes
const double = useMemo(() => {
return expensiveCalculation(num);
}, [num]); // Dependency Array
return (
<>
<input value={num} onChange={e => setNum(e.target.value)} />
<button onClick={() => setDark(!dark)}>Toggle Theme</button>
<div>Result: {double}</div>
</>
);
}useMemo has a cost (memory + comparison check). Don't use it for cheap calculations like a + b or simple string details.