Ambele stochează ceva pe parcursul randărilor, așa că nu este recalculat/recreat de fiecare dată:
useMemostochează o .
Ambele stochează ceva pe parcursul randărilor, așa că nu este recalculat/recreat de fiecare dată:
useMemo stochează o .useCallback stochează identitatea unei funcții (este useMemo(() => fn, deps)).Ele există pentru a evita (a) repetarea unor lucrări costisitoare și (b) ruperea egalității referenciale pe care copiii memoizați depind.
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} />;
}
Fără useCallback, handleSelect este o funcție complet nouă la fiecare randare. Un React.memo(Grid) ar vedea o prop "nouă" și ar continua să se randeze oricum, anulând memoizarea. Același lucru este valabil pentru un obiect trecut unui copil memoizat sau folosit într-un tablou de dependență useEffect.
const x = useMemo(() => a + b, [a, b]); // ❌ pointless — adding is cheaper than memoizing
useMemo/useCallback prematur peste tot adaugă zgomot și poate fi chiar mai lent. (Compilatorul React 19 poate auto-memoiza, reducând necesitatea.)