React prop explosion happens when a component collects too many props, or when one prop is threaded through layers that never use it. The fixes are composition, grouping related values, and context only for genuinely shared data.
What prop explosion looks like
The symptoms are easy to spot. A component takes a dozen props that describe unrelated concerns, and several of them only pass through to a deeper child. Every new feature adds one more prop until the call site is unreadable.
A UserTable that grows isEditing, selectedIds, onRowClick, sortColumn, sortDirection, pageSize, and onExport is the classic case: one component trying to be a table, a form, and a toolbar at once. Two signs say stop: a prop that travels through components that never read it, and a prop list that mixes data, events, and appearance.
Compose instead of threading props
When props only travel through a component to reach a child, the middle component should not own them. Let it accept children and render them, so the data flows straight to the component that uses it.
function Layout({ children }) {
return <main className="layout">{children}</main>;
}
function Posts({ posts }) {
return (
<Layout>
<PostList posts={posts} />
</Layout>
);
}The layout no longer knows about posts, pagination, or any other page concern. Each page passes its own content as children, which removes the props that used to travel through the layout.
Before composing, a page passed title, posts, onSelect, and loading to a layout that only wrapped them in a main tag. After composing, the layout takes children and the page renders its list directly.
The wrapper becomes a pure layout concern, which is exactly the role it should have kept. This is the core idea behind The children Prop in React.
Spread syntax is not the fix. Spreading a giant props object through a wrapper hides the explosion instead of removing it. Spread is useful only for forwarding a few props to a native element, and even then it deserves a second look.
Group related props into one object
Props that describe the same thing should travel together. A user card that takes name, email, role, and avatar separately can take one user object instead.
function UserCard({ user, onEdit, onDelete }) {
return (
<section className="card">
<img src={user.avatar} alt={user.name} />
<h2>{user.name}</h2>
<p>{user.role}</p>
<button onClick={onEdit}>Edit</button>
<button onClick={onDelete}>Delete</button>
</section>
);
}The call site passes one user object and two handlers instead of a long list of user fields. When the user shape grows, the card reads the new field from the object instead of adding another prop. This is also the difference between a clean interface and prop drilling.
Do not group unrelated fields just to shrink the list. Grouping an avatar with an onDelete callback hides an action inside a data object and makes the component harder to read. The object also gives the data one obvious home: when the user shape gains a field, it changes in one schema instead of every component that touches it.
Context is the last tool
Context skips the middle of the tree, which helps when many distant components read the same value. It is not a replacement for every prop list.
Reach for context for a theme, the signed-in user, or a shared setting that appears all over the app. For a value used by one or two nearby components, an explicit prop is clearer. The full comparison is in Context vs Props.
A value read by one child is a prop; a value read by thirty scattered components is a candidate for context. But context is the last tool because it makes the data flow implicit, so check whether composition or grouping solves the problem first.
Checklist
When a call site starts wrapping lines, walk this list before adding another prop.
- Compose with children when props only pass through a wrapper.
- Group fields that describe one thing into an object prop.
- Keep one prop per independent concern.
- Use context only for widely shared values.
- Prefer an explicit list over spread syntax when the list is small.
Rune AI
Key Insights
- Compose with children instead of threading props through layers.
- Group related props into a single object prop.
- Use spread syntax sparingly.
- Reach for context only for genuinely shared cross-cutting data.
- An explicit prop list is often better than a clever shortcut.
Frequently Asked Questions
How many props is too many?
Does spreading props fix prop explosion?
Conclusion
Avoid prop explosion by composing components with children, grouping related props into one object, and using context only for data many distant components share. Keep the data flow explicit.
More in this topic
How to Build a Dropdown Menu in React
Build a React dropdown menu with the ARIA menu button pattern. Handle open and close, keyboard arrows, and clicks outside the menu.
How to Animate React Components with Motion
Animate React components with the Motion library. Set up motion, add enter, hover, and exit animations, and respect reduced motion.
Headless UI Components Explained: Logic Without Locked Styling
Understand headless UI components and how libraries like Radix give you unstyled, accessible behavior that you style yourself.