When a React application starts to feel slow, the instinctive response is often to reach for optimization tools. Memoization, useCallback, useMemo, and profiling sessions quickly enter the conversation. While these tools are valuable, they’re rarely where the real problem begins.
Most React performance issues originate in state design, not rendering itself.
React is extremely good at re-rendering. Rendering is cheap. What becomes expensive is what triggers re-renders and how much of the tree is affected. When state is lifted too high, tightly coupled, or mutated indirectly, small changes can ripple through large portions of the application.
A common smell is global or top-level state that changes frequently. When many components depend on the same piece of state, React is forced to re-evaluate large subtrees even if most of them don’t truly care about the change. The result feels like a rendering problem, but it’s really a data ownership problem.
Well-structured React applications tend to have clearly owned state. State lives as close as possible to where it’s used. Derived data is computed locally rather than stored globally. Components are allowed to re-render freely because their renders are cheap and isolated.
Another common trap is premature optimization. Memoization added too early often increases complexity without solving the root cause. It introduces dependency management, stale values, and mental overhead, all to compensate for unclear state boundaries. When the architecture is right, many “performance issues” disappear without any explicit optimization.
A useful mental shift is to stop asking “how do I prevent this component from re-rendering?” and instead ask “why does this state change affect so much of the app?” The answer to that question usually points directly to the fix.
React performance is largely an architectural concern. Get state ownership and data flow right, and rendering tends to take care of itself.
If you enjoyed this, you can follow my work on LinkedIn at linkedin
, explore my projects on GitHub
, or find me on Bluesky
Top comments (0)