React.memo is quietly hurting a lot of React apps. Yes. Hurting. I’ve seen senior engineers do this: export default React.memo(Component) And then: <Component data={{ dark: true }} /> That object is recreated. On every render. React does a shallow comparison. New reference = re-render. So your “optimization” just became decoration. Now multiply that across 40–50 components in a dashboard. That’s hundreds of unnecessary renders per interaction. And here’s the twist: Overusing useMemo and useCallback can also slow things down. Every memo: Allocates memory Tracks dependencies Adds cognitive load Increases debugging complexity If a component renders in 0.2ms, let it render. Optimization without profiling is guessing. The real rule: → Expensive subtree? Memoize it → Passing unstable objects/functions? Stabilize them → Small presentational component? Don’t touch it Stop cargo-culting React.memo. Start understanding reference equality. What React “best practice” did you unlearn as you got more experienced? #React #Frontend #JavaScript #WebDev #Performance
Hot take: If you’re adding React.memo before using the Profiler, you’re optimizing blind.
React.memo uses shallow comparison. Primitives → compared by value Objects/functions → compared by reference So if you’re passing inline objects or callbacks… your memo is already broken. Do you profile before adding memoization?