フラグメントとは
コンポーネントが複数の要素を返す際に、フラグメントを使うことで、DOMに余分なノードを追加せずに子要素をまとめることができるようになります。
以下のようにすることで、まとめられます。
render() {
return (
<React.Fragment>
<ChildA />
<ChildB />
<ChildC />
</React.Fragment>
);
}
フラグメントを使わない際の問題点
以下のようなコンポーネントがあったとします。その場合、無駄に
タグを生成することになってしまい、余分なノードを追加することになります。
class Table extends React.Component {
render() {
return (
<table>
<tr>
<Columns />
</tr>
</table>
);
}
}
class Columns extends React.Component {
render() {
return (
<div>
<td>Hello</td>
<td>World</td>
</div>
);
}
}
出力結果は以下の通りです。
<table>
<tr>
<div> { // このタグが余分 }
<td>Hello</td>
<td>World</td>
</div> { // このタグが余分 }
</tr>
</table>
解決策
以下のようにすることで、余分なノードを追加しなくても良くなります。
class Columns extends React.Component {
render() {
return (
<React.Fragment>
<td>Hello</td>
<td>World</td>
</React.Fragment>
);
}
}
出力結果は以下の通りです。
<table>
<tr>
{ // 無駄なタグが生成されていない }
<td>Hello</td>
<td>World</td>
</tr>
</table>
省略記法
フラグメントの記法については省略することも可能です。
class Columns extends React.Component {
render() {
return (
<>
<td>Hello</td>
<td>World</td>
</>
);
}
}
keyを持たせる
明示的に宣言したフラグメントではkeyを持つことが可能です。これはコレクションをフラグメントの配列に変換するときに有用です。
function Glossary(props) {
return (
<dl>
{props.items.map(item => (
// キーがなければ警告が出る
<React.Fragment key={item.id}>
<dt>{item.term}</dt>
<dd>{item.description}</dd>
</React.Fragment>
))}
</dl>
);
}