Beide cachen etwas über Renders hinweg, damit es nicht jedes Mal neu berechnet/neu erstellt wird:
- cached einen .
Beide cachen etwas über Renders hinweg, damit es nicht jedes Mal neu berechnet/neu erstellt wird:
useMemouseCallback cached die Identität einer Funktion (das ist useMemo(() => fn, deps)).Sie existieren, um (a) wiederholte teure Arbeit zu vermeiden und (b) referenzielle Gleichheit nicht zu brechen, auf die memoized Kinder angewiesen sind.
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} />;
}
Ohne useCallback ist handleSelect bei jedem Render eine brandneue Funktion. Ein React.memo(Grid) würde ein "neues" Prop sehen und sowieso neu rendern, wodurch die Memoization besiegt wird. Dasselbe gilt für ein Objekt, das an ein memoized Kind übergeben oder in einem useEffect Dependency Array verwendet wird.
const x = useMemo(() => a + b, [a, b]); // ❌ pointless — adding is cheaper than memoizing
useMemo/useCallback überall fügt Rauschen hinzu und kann sogar langsamer sein. (Reacts Compiler in Version 19 kann automatisch memoizen, was den Bedarf verringert.)