React Fragments - Clean JSX Without Extra Divs
Have you ever wanted to return multiple elements from a component but React forced you to wrap them in a div? That's where React Fragments come in! They let you group elements without adding extra DOM nodes.
The Problem
In React, components can only return one element. So if you want to return multiple things, you have to wrap them:
// This works, but adds an extra div
function Component() {
return (
<div>
<h1>Title</h1>
<p>Paragraph</p>
<button>Click me</button>
</div>
);
}That extra div might not seem like a big deal, but it can mess up your CSS layout, especially with flexbox or grid. Plus, it's just unnecessary!
The Solution: React Fragments
Fragments let you group elements without adding a wrapper:
import { Fragment } from 'react';
function Component() {
return (
<Fragment>
<h1>Title</h1>
<p>Paragraph</p>
<button>Click me</button>
</Fragment>
);
}Now there's no extra div in the DOM! Much cleaner.
Short Syntax
You can also use the shorter syntax with empty tags:
function Component() {
return (
<>
<h1>Title</h1>
<p>Paragraph</p>
<button>Click me</button>
</>
);
}This <>...</> is the same as <Fragment>...</Fragment>. Most developers prefer this shorter version because it's cleaner!
When to Use Fragments
1. Returning Multiple Elements
The most common use case:
function Card() {
return (
<>
<img src="photo.jpg" alt="Photo" />
<h2>Card Title</h2>
<p>Card description</p>
</>
);
}2. Conditional Rendering
When you conditionally return different elements:
function UserProfile({ user }) {
if (!user) {
return (
<>
<p>Loading...</p>
<Spinner />
</>
);
}
return (
<>
<h1>{user.name}</h1>
<p>{user.email}</p>
</>
);
}3. Lists Without Wrappers
When rendering lists without a wrapper:
function Table() {
return (
<table>
<tbody>
{items.map(item => (
<Fragment key={item.id}>
<tr>
<td>{item.name}</td>
</tr>
</Fragment>
))}
</tbody>
</table>
);
}Fragments with Keys
When using fragments in lists, you need the full <Fragment> syntax with a key:
function List({ items }) {
return (
<ul>
{items.map(item => (
<Fragment key={item.id}>
<li>{item.title}</li>
<li>{item.description}</li>
</Fragment>
))}
</ul>
);
}You can't use <> with keys - you must use <Fragment key={...}>.
Real-World Example
Here's a complete example showing fragments in action:
function BlogPost({ post }) {
return (
<>
<header>
<h1>{post.title}</h1>
<p>By {post.author}</p>
</header>
<main>
<p>{post.content}</p>
</main>
<footer>
<span>Published: {post.date}</span>
<button>Share</button>
</footer>
</>
);
}This keeps your HTML clean without extra wrapper divs!
Fragments vs Divs
When should you use fragments vs divs?
Use Fragments when:
- You don't need styling on the wrapper
- You want cleaner HTML output
- CSS layout might break with extra divs
- You're just grouping elements
Use Divs when:
- You need to style the wrapper
- You need event handlers on the wrapper
- You need a container for CSS grid/flexbox
Common Patterns
Pattern 1: Multiple Root Elements
function Layout() {
return (
<>
<Header />
<Main />
<Footer />
</>
);
}Pattern 2: Conditional Multiple Returns
function Alert({ type, message }) {
if (type === 'error') {
return (
<>
<ErrorIcon />
<p>{message}</p>
</>
);
}
return (
<>
<SuccessIcon />
<p>{message}</p>
</>
);
}Pattern 3: Grouping Without Wrapper
function FormGroup({ label, children }) {
return (
<>
<label>{label}</label>
{children}
</>
);
}Tips and Best Practices
- Prefer
<>syntax - It's shorter and cleaner - Use
<Fragment>with keys - When you need keys in lists - Don't overuse - Sometimes a div is actually what you need
- Keep it simple - Fragments are just for grouping, nothing fancy
Common Mistakes
Mistake 1: Forgetting Import
// Wrong - Fragment not imported
function Component() {
return <Fragment>...</Fragment>;
}
// Right - Use empty tags
function Component() {
return <>...</>;
}Mistake 2: Using Key with Empty Tags
// Wrong - Can't use key with <>
{items.map(item => (
<>...</> // No key possible
))}
// Right - Use Fragment with key
{items.map(item => (
<Fragment key={item.id}>...</Fragment>
))}Conclusion
React Fragments are a simple but powerful feature. They help you write cleaner code and avoid unnecessary DOM elements. Once you start using them, you'll wonder how you lived without them!
Remember:
- Use
<>...</>for simple grouping - Use
<Fragment key={...}>when you need keys - Fragments don't render anything in the DOM
- They're perfect for keeping your HTML clean
Visual Explanation: Fragments vs Divs
Here's the difference in DOM output:
With Div Wrapper:
┌─────────────────────────────┐
│ <div> │ ← Extra wrapper
│ <h1>Title</h1> │
│ <p>Content</p> │
│ </div> │
└─────────────────────────────┘
With Fragment:
┌─────────────────────────────┐
│ <h1>Title</h1> │ ← No wrapper!
│ <p>Content</p> │
└─────────────────────────────┘
Cleaner HTML output!Fragment Usage Flow
Component Returns Multiple Elements
│
▼
┌──────────────┐
│ Need wrapper?│
└──────┬───────┘
│
┌───┴───┐
│ │
Yes No
│ │
▼ ▼
Use Use
Fragment DivFrequently Asked Questions (FAQ)
Q1: When should I use fragments vs divs?
A:
- Use Fragment - When you don't need styling/events on wrapper
- Use Div - When you need CSS or event handlers on container
Q2: Can I style fragments?
A: No! Fragments don't render anything, so you can't style them. Use a div if you need styling.
Q3: What's the difference between <> and ?
A: They're the same! <> is shorthand. Use <> unless you need keys (then use <Fragment key={...}>).
Q4: Can I use fragments with keys?
A: Yes, but you must use <Fragment key={...}>, not <>. The shorthand doesn't support keys.
Q5: Do fragments improve performance?
A: Slightly - they reduce DOM nodes. But the main benefit is cleaner HTML and avoiding CSS issues.
Q6: Can I nest fragments?
A: Yes, but usually unnecessary. Fragments are meant to avoid wrappers, not create them.
Q7: Are fragments required in React?
A: No! You can always use divs. Fragments are optional - use them when you want cleaner HTML.
Q8: Can I use fragments in class components?
A: Yes! Fragments work in both functional and class components.
Q9: What happens if I return multiple elements without fragment?
A: React will throw an error! Components must return a single element. Use Fragment or div to wrap.
Q10: Do fragments work with CSS Grid/Flexbox?
A: Yes! That's actually a common use case - fragments let you use Grid/Flexbox without extra wrappers.
Next Steps
Now that you understand fragments, here's what to learn next:
- Next: Learn about Props in React - Pass data between components
- Explore State in React - Manage component data
- Understand Components - Build more complex components
Happy coding! 🎉