In React, the children
prop is a special built-in prop automatically passed to every component. It represents the content between the opening and closing tags of a component.
It enables component composition, allowing you to build flexible and reusable UI structures.
Basic Usage
Example:
function Card(props) { return <div className="card">{props.children}</div>; } function App() { return ( <Card> <h2>Title</h2> <p>This is some content inside the card.</p> </Card> ); }
Output:
<div class="card"> <h2>Title</h2> <p>This is some content inside the card.</p> </div>
Explanation:
<Card>
is used as a wrapper.- Anything between
<Card>...</Card>
is accessible inside the component asprops.children
.
Why Use children
?
1. Component Composition
- You can build layout components like
Modal
,Panel
, orCard
and fill them with any children content. - Makes components flexible and highly reusable.
2. Reduces Prop Clutter
- Instead of passing each inner content as a named prop (
title
,body
,footer
, etc.), you can nest them insidechildren
.
3. Nesting and Layout Management
- Enables logical and readable UI nesting, similar to HTML semantics.
Examples in Practice
1. Simple Container
function Wrapper({ children }) { return <section>{children}</section>; } <Wrapper> <p>Hello, world!</p> </Wrapper>
2. Using Multiple Children Elements
function List({ children }) { return <ul>{children}</ul>; } <List> <li>Apple</li> <li>Banana</li> </List>
Advanced Patterns with children
1. Conditional Rendering Based on Children
function OptionalRenderer({ children }) { if (!children) return <p>No content provided.</p>; return <div>{children}</div>; }
2. Custom Layout Using JSX Structure
function Layout({ children }) { return ( <div className="layout"> <header>Header</header> <main>{children}</main> <footer>Footer</footer> </div> ); } <Layout> <p>Main content goes here</p> </Layout>
Manipulating children
with React Utilities
React provides APIs to manipulate or iterate over children, especially when children
is not a single element.
1. React.Children.map
Useful for transforming or wrapping each child:
function StyledList({ children }) { return ( <ul> {React.Children.map(children, (child) => ( <li className="styled-item">{child}</li> ))} </ul> ); }
2. React.Children.count
Count how many child elements are passed:
const count = React.Children.count(props.children);
3. React.Children.toArray
Returns an array — helpful when you want to filter, reverse, or sort children:
const reversedChildren = React.Children.toArray(props.children).reverse();
4. React.cloneElement
Allows you to clone and inject props into each child:
React.Children.map(props.children, child => React.cloneElement(child, { className: 'padded' }) );
Best Practices
- Always Render
children
Safely- If the component is meant to be used as a wrapper, ensure you include
{props.children}
somewhere in the return block.
- If the component is meant to be used as a wrapper, ensure you include
- Type
children
Properly (with TypeScript/PropTypes)
interface MyComponentProps { children: React.ReactNode; }
- Use Composition Over Prop Drilling
- Prefer passing JSX children over passing nested data via props — this improves maintainability and readability.
- Avoid Overcomplicating with Too Much Nesting
- Use judiciously to keep JSX readable and component behavior predictable.
Real-World Use Case: Modal
function Modal({ isOpen, children }) { if (!isOpen) return null; return ( <div className="modal-overlay"> <div className="modal-content">{children}</div> </div> ); } // Usage <Modal isOpen={true}> <h2>Confirm Delete</h2> <button>Delete</button> </Modal>