Five React Performance Patterns That Are Now Anti-Patterns in 2026
React codebases are littered with manual memoization that AI coding assistants keep generating from outdated training data. Leaving those patterns in place increases bundle size, slows renders through unnecessary shallow comparisons, and makes code harder to read and maintain — all for optimizations the compiler now handles better.
With the React Compiler now performing automatic, expression-level memoization at build time, the manual memoization patterns that dominated React codebases for years have become anti-patterns. Wrapping every calculation in useMemo, every callback in useCallback, and every component in React.memo adds maintenance overhead, memory cost, and clutter without the performance gains the compiler already provides. The same shift applies to data fetching: useEffect plus useState for server requests is officially discouraged in favor of TanStack Query or React 19's `use` hook, which handle caching, race conditions, and deduplication automatically. Over-splitting components to avoid re-renders is another common mistake that increases reconciliation work rather than reducing it; the real lever is state co-location. The rule of thumb is now simple: profile first, and delete any optimization the profiler cannot justify.
AI coding assistants are perpetuating obsolete React patterns because their training data is frozen in the 2020–2024 era before the compiler existed.
The shift from manual memoization to compiler-driven optimization changes the developer's job from writing cache guards to deleting them during code review.
React.memo becomes a net negative when the cost of a shallow props comparison exceeds the cost of re-rendering a simple component — a threshold many teams never measure.
State co-location is a more impactful performance strategy than component splitting, yet it is rarely taught as the primary alternative to useMemo and React.memo.