React で使う JSX では 1 つのコンポーネントから複数のDOM要素を通常の記述では返すことはできません。
但し React.Fragment を使えば 1 つのコンポーネントから複数のDOM要素を返えせるようになります。
この記事では React.Fragment の使い方を解説します。
React 環境の作成方法は以下のサイトを参照して作成してください。

Next.jsでReactを使った開発環境を作成する方法
Reactを利用してアプリケーションを作成する環境を作るには「npx create-react-app」もしくは「npx...
React のコンポーネントから複数要素を返す
通常 React で使う JSX では 1 つのコンポーネントから複数のDOM要素を通常の記述では返すことはできません。
import React from "react" ;
import Button from "@material-ui/core/Button" ;
export default function Home(){
return (
<Button variant="contained" color="primary">
OKボタン
</Button>
<Button variant="contained" color="secondary">
CANCELボタン
</Button>
);
}
上記のコードを実行させると
Syntax error: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>?
7 | OKボタン
8 | </Button>
> 9 | <Button variant="contained" color="secondary">
| ^
10 | CANCELボタン
11 | </Button>
12 | );
とエラーになります。
これは Button コンポーネントが複数のトップノードとして return されているからです。
対処方法の 1 つとしては div タグで全体を囲めば一応の問題は解決します。
import React from "react" ;
import Button from "@material-ui/core/Button" ;
export default function Home(){
return (
<div id="outer-div">
<Button variant="contained" color="primary">
OKボタン
</Button>
<Button variant="contained" color="secondary">
CANCEボタン
</Button>
</div>
);
}
でも、例えば table タグの td タグなどを編集して返すコンポーネントなどを作成する場合に divタグを挟むとおかしくなるので困ります。
import React from "react" ;
import Button from "@material-ui/core/Button" ;
export default function MyTableCell(){
return (
<div id="outer-div">
<tr><td>cell-01</td><td>cell-02</td></tr>
<tr><td>cell-03</td><td>cell-04</td></tr>
</div>
);
}
これを実行すると
Expected server HTML to contain a matching <tr> in <div>.
at tr
at div
at MyTableCell
at MyApp
と警告が出てきます。
こんな時に使うのが React.Fragment です。
import React from "react" ;
import Button from "@material-ui/core/Button" ;
export default function MyTableCell(){
return (
<React.Fragment>
<tr><td>cell-01</td><td>cell-02</td></tr>
<tr><td>cell-03</td><td>cell-03</td></tr>
</React.Fragment>
);
}
このように React.Fragment で囲めば JSX 返すDOM要素が複数個あっても、エラーや警告にならず、余計な div タグもでることはありません。
(上記の例では table タグがないよという別の警告にはなりますが。)
また React.Fragment は <>と</>(本当は半角文字で書く)で代用することも可能です。
import React from "react" ;
import Button from "@material-ui/core/Button" ;
export default function MyTableCell(){
return (
<>
<tr><td>cell-01</td><td>cell-02</td></tr>
<tr><td>cell-03</td><td>cell-03</td></tr>
</>
);
}
まとめ
React の1 つのコンポネントから複数の DOM 要素を返したい時は React.Fragment タグを使えば警告の出ず、かつ余分な div タグなどを使うこと無い JSX を書くことができます。
