
While developing user interfaces in React, you may encounter the following error message:
Syntax Error: Adjacent JSX elements must be wrapped in an enclosing tag. JSX expressions must have one parent element.
This syntax error is common—especially for beginners—and it usually happens when returning multiple JSX elements side by side without wrapping them in a single container. Although the fix is straightforward, understanding why the error occurs is crucial to writing clean and functional React code.
In this article, we’ll explain the root cause of the error, walk through common mistakes, and show best practices to avoid it entirely using div
, section
, or React.Fragment
.
Why This Error Happens in JSX
JSX allows you to write HTML-like code in JavaScript, but it’s still just JavaScript underneath. During compilation, JSX is transformed into React.createElement()
calls. These function calls must return one single parent element, which can contain multiple child elements.
If you try to return multiple sibling elements directly, React will throw the “JSX expressions must have one parent element” error, because the compiler doesn’t know how to group them.
Common Mistake: Multiple Root Elements in Return
function MyComponent() {
return (
<h1>Welcome</h1>
<p>This is a paragraph.</p>
);
}
What’s wrong?
React sees two JSX elements (<h1>
and <p>
) being returned without a common wrapper. Since JSX must evaluate to a single element, this breaks the rendering logic.
Solution 1: Wrap in a Container Element
The most direct fix is to wrap the elements in a container like <div>
, <section>
, or another valid HTML tag.
function MyComponent() {
return (
<div>
<h1>Welcome</h1>
<p>This is a paragraph.</p>
</div>
);
}
This is the simplest way to satisfy JSX’s requirement for a single parent element. However, using containers indiscriminately can lead to unnecessary <div>
elements in the DOM—often referred to as “div soup.”
Solution 2: Use React Fragments (<> ... </>
)
React Fragments allow you to group elements without adding extra nodes to the DOM. This is especially useful when structural wrapping is needed purely for JSX validity.
function MyComponent() {
return (
<>
<h1>Welcome</h1>
<p>This is a paragraph.</p>
</>
);
}
Or using the full syntax if you need to add keys or attributes (e.g., during iteration):
import React from 'react';
function MyComponent() {
return (
<React.Fragment>
<h1>Welcome</h1>
<p>This is a paragraph.</p>
</React.Fragment>
);
}
Fragments do not render any HTML tags in the final output, keeping your DOM clean while solving the JSX constraint.
Real-World Example: Rendering Multiple Rows or List Items
This error often surfaces when rendering lists of elements like <tr>
inside tables or <li>
inside unordered lists.
Incorrect: Multiple <tr>
Without Wrapper
function TableRows() {
return (
<tr>
<td>Name</td>
</tr>
<tr>
<td>Email</td>
</tr>
);
}
Correct: Use Fragments to Group Rows
function TableRows() {
return (
<>
<tr>
<td>Name</td>
</tr>
<tr>
<td>Email</td>
</tr>
</>
);
}
This ensures all table rows are grouped without adding an extra DOM node, which would be invalid inside a <table>
.
Conditional Rendering Pitfall
When using conditional rendering, remember to group multiple elements under one parent.
Incorrect
{isLoggedIn &&
<h1>Welcome back!</h1>
<p>We're glad to see you.</p>
}
Correct
{isLoggedIn && (
<>
<h1>Welcome back!</h1>
<p>We're glad to see you.</p>
</>
)}
Parentheses help visually group the condition, while the fragment ensures the JSX remains syntactically valid.
Debugging Tips
If you get this error, use these techniques to quickly resolve it:
- Check your return statement – Are multiple sibling tags present?
- Look for implicit returns in arrow functions – Even in short-form arrow functions, you must use a parent wrapper.
- Use
Prettier
or a JSX linter – These tools highlight structural issues immediately. - Wrap multiple elements in a fragment first – You can always refactor to a semantic wrapper later if needed.
Best Practices to Avoid This Error
- Always return a single root JSX element from each component or JSX block.
- Use
<></>
(fragments) to group elements when you don’t need an actual HTML wrapper. - Be mindful of DOM structure when using elements like
<ul>
,<tr>
,<tbody>
—avoid invalid nesting. - If rendering inline JSX in conditional expressions or
.map()
loops, wrap the return in a fragment or appropriate parent element.
Final Thoughts
The “JSX expressions must have one parent element” error in React is a helpful reminder that JSX must return a single element. While it may seem restrictive at first, it helps ensure your component trees remain well-structured and predictable.
By consistently wrapping sibling elements in either a semantic container or a React Fragment, you’ll write cleaner, error-free JSX and avoid structural bugs that can be harder to diagnose down the line.

I’m Shreyash Mhashilkar, an IT professional who loves building user-friendly, scalable digital solutions. Outside of coding, I enjoy researching new places, learning about different cultures, and exploring how technology shapes the way we live and travel. I share my experiences and discoveries to help others explore new places, cultures, and ideas with curiosity and enthusiasm.