दोनों किसी चीज़ को renders के बीच cache करते हैं ताकि हर बार उसे दोबारा compute/recreate न करना पड़े:
- एक को cache करता है।
दोनों किसी चीज़ को renders के बीच cache करते हैं ताकि हर बार उसे दोबारा compute/recreate न करना पड़े:
useMemouseCallback एक function की identity को cache करता है (यह useMemo(() => fn, deps) है)।ये इसलिए मौजूद हैं ताकि (a) महंगे काम को दोहराने से और (b) referential equality को तोड़ने से बचा जा सके, जिस पर memoized children निर्भर करते हैं।
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} />;
}
useCallback के बिना, handleSelect हर render पर एक बिल्कुल नया function होता है। एक React.memo(Grid) इसे एक "नया" prop समझकर वैसे भी re-render करेगा, जिससे memoization बेकार हो जाता है। यही बात किसी memoized child को pass किए गए object के लिए या useEffect dependency array में उपयोग किए गए object के लिए भी लागू होती है।
const x = useMemo(() => a + b, [a, b]); // ❌ pointless — adding is cheaper than memoizing
useMemo/useCallback लगाना शोर बढ़ाता है और यह धीमा भी हो सकता है। (React 19 का compiler अपने आप memoize कर सकता है, जिससे इसकी ज़रूरत कम हो जाती है।)