【React】Adjacent JSX elements must be wrapped in an enclosing tag エラーの解決方法
2分で読める
テック
最終更新:
ReactでコンポーネントをJSXで書いていると、次のエラーに遭遇することがあります。
Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>?
自分はRails APIをReactから叩くアプリケーションを開発しているときに初めてこのエラーに遭遇しました。原因と解決方法を整理します。
エラーの原因
Reactのコンポーネントは、returnで返すJSXのルート要素は必ず1つでなければならないというルールがあります。
たとえば、次のコードはエラーになります。
function MyComponent() {
return (
<h1>タイトル</h1>
<p>本文</p>
);
}
<h1> と <p> という2つの要素が並列に並んでいるため、ルート要素が2つ存在してしまいます。これがエラーの原因です。
解決方法1: divで囲む
最もシンプルな解決方法は、複数の要素を <div> で囲んでルート要素を1つにすることです。
function MyComponent() {
return (
<div>
<h1>タイトル</h1>
<p>本文</p>
</div>
);
}
解決方法2: JSXフラグメントを使う
<div> で囲む方法はシンプルですが、HTMLに不要な <div> が増えてしまうという問題があります。レイアウトへの影響を避けたい場合は、JSXフラグメント(<>...</>)を使うのがおすすめです。
function MyComponent() {
return (
<>
<h1>タイトル</h1>
<p>本文</p>
</>
);
}
フラグメントはDOM上には何も出力されないため、HTMLの構造をきれいに保てます。エラーメッセージ自体が Did you want a JSX fragment <>...</>? と提案していますね。
まとめ
| 方法 | 特徴 |
|---|---|
<div> で囲む | シンプル。ただしDOMに余分なdivが追加される |
<>...</> フラグメント | DOMに影響なし。React 16.2以降で使用可能 |
基本的にはフラグメントを使う方法が現代的な書き方です。<div> を使う必要がある場合(スタイルを当てたいなど)以外は、フラグメントを選ぶとよいです。
記事の更新をメールで受け取る
質問・リクエストを送る
記事についての質問や、取り上げてほしいテーマがあればお気軽にどうぞ。いただいた質問はブログ記事として回答し、Q&Aページで公開することがあります。