Begge cacher noget på tværs af renders, så det ikke genberegnes/genoprettes hver gang:
useMemocacher en .
Begge cacher noget på tværs af renders, så det ikke genberegnes/genoprettes hver gang:
useMemo cacher en .useCallback cacher en funktions identitet (det er useMemo(() => fn, deps)).De findes for at undgå (a) at gentage dyrt arbejde og (b) at bryde referential equality, som memoized børn er afhængige af.
function Table({ rows, onSelect }) {
// (a) expensive computation — recompute only when `rows` changes
const sorted = useMemo(() => rows.slice().sort(byName), [rows]);
// (b) stable function identity — so a React.memo child doesn't re-render,
// and effects depending on it don't re-fire
const handleSelect = useCallback(id => onSelect(id), [onSelect]);
return <Grid rows={sorted} onSelect={handleSelect} />;
}
Uden useCallback er handleSelect en helt ny funktion ved hver render. En React.memo(Grid) ville se et "nyt" prop og alligevel re-rendere, hvilket ville beseire memoization. Det samme for et objekt, der sendes til et memoized barn eller bruges i et useEffect dependency array.
const x = useMemo(() => a + b, [a, b]); // ❌ pointless — adding is cheaper than memoizing
useMemo/useCallback overalt tilføjer støj og kan endda være langsommere. (React 19s compiler kan auto-memoize, hvilket reducerer behovet.)