REACT & NEXT.JS / 3. USEREF, USEMEMO, USECALLBACK
useRef, useMemo & useCallback
Performance hooks — avoid unnecessary renders and recomputation
EXPLANATION
useRef: a mutable container that persists across renders without causing re-renders. Two uses: 1. DOM reference → ref.current points to the actual DOM element 2. Mutable value that shouldn't trigger re-render (e.g. storing previous value, timers) useMemo: memoizes an expensive computed value. const result = useMemo(() => expensiveCalc(a, b), [a, b]) Only recomputes when a or b changes. For everything else, returns cached value. useCallback: memoizes a function reference. const fn = useCallback(() => doSomething(x), [x]) Without this, a new function object is created on every render, which breaks React.memo and causes child re-renders. When to use: • useMemo → expensive computations (filtering large lists, complex transforms) • useCallback → functions passed as props to memoized child components • useRef → DOM manipulation, storing timers, previous values When NOT to use: don't add these everywhere "for performance". They add overhead. Profile first, optimize second.
DIAGRAM
Without useCallback: Parent renders → new onClick function created → Child sees new prop reference → Child re-renders (even if React.memo!) With useCallback: Parent renders → same onClick reference returned (if deps unchanged) → Child sees same prop reference → Child skips re-render ✓ useMemo example: [1000 items] → filter → sort → format Without useMemo: runs every render (even unrelated state changes) With useMemo([items, filter]): only runs when items or filter changes
CODE