Båda cachar något mellan renderingar så det inte beräknas/skapas på nytt varje gång:
useMemocachar ett .
Båda cachar något mellan renderingar så det inte beräknas/skapas på nytt varje gång:
useMemo cachar ett .useCallback cachar en funktions identitet (det är useMemo(() => fn, deps)).De finns till för att undvika (a) att upprepa dyrt arbete och (b) att bryta referenslikhet som memoizerade barn är beroende av.
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} />;
}
Utan useCallback är handleSelect en helt ny funktion varje rendering. En React.memo(Grid) skulle se en "ny" prop och skulle ändå renderas, vilket besegrar memoizeringen. Samma för ett objekt som skickas till ett memoizerat barn eller används i en useEffect beroendearry.
const x = useMemo(() => a + b, [a, b]); // ❌ pointless — adding is cheaper than memoizing
useMemo/useCallback överallt lägger till brus och kan till och med vara långsammare. (React 19:s compiler kan automatiskt memoizera, vilket minskar behovet.)