投稿日:2021年2月6日
Reactでは複数の要素を返したい場合Fragmentタグを使用することで無駄なdivタグを削除することができます。
Reactではコンポーネントとして複数の要素を返したい場合、以下のようにそのまま書くことができません。
import React from "react";
const SampleComponent : React.FC = () : JSX.Element =>{
return (
<div>Mars</div>
<div>quai</div>
)
}
[Error] JSX expressions must have one parent element.
JSXの表現がトランスパイル後にどのようなコードになるのかが理解できている人にとっては当然のエラーでしょう(ここでは詳しい説明は省きます)。
このエラーを回避するために、複数の要素を入れる場合には必ず一つのタグの中に入れる必要があります。
適当にdivタグで包んでしまってもいいのですが…
Reactにはこのような場合のためにFragmentというタグが用意されています。
このタグは機能を持たないタグです。
以下のように複数タグをJSXで返したい場合に使用します。
import React from "react";
const SampleComponent = () =>{
return (
<React.Fragment>
<div>Mars</div>
<div>quai</div>
</React.Fragment>
)
}
コンポーネントの返し値として以外にも、map()関数で複数要素を返したい場合にもよく使います。
const SampleComponent = () =>{
return (
<React.Fragment>
{sampleArray.map((i, key) => {
return (
<React.Fragment key={key}>
<div>Hello!!</div>
<div>{i}</div>
</React.Fragment>
)
})}
</React.Fragment>
)
}
map()関数で返している要素の中でFragmentにkeyをpropsとして渡しています。
keyはFragmentが受け取れる唯一のpropsです。
Fragmentは空のタグ<></>として書くことができます。
ただし、keyを渡す場合には空のタグは使えないことに注意しましょう。
const SampleComponent = () =>{
return (
<>
{sampleArray.map((i, key) => {
return (
<React.Fragment key={key}>
<div>Hello!!</div>
<div>{i}</div>
</React.Fragment>
)
})}
</>
)
}
React.Fragmentには特徴があり、普通のタグを使用するよりメモリ使用率が少し低かったりします。
実際にFragmentとdivでメモリ使用率を比較したところ、Fragmentよりdivのほうが1.5倍メモリを使用していました。
大量の情報が含まれたArrayなどをmapでレンダリングする場合などには、必ずFragmentを使用しましょう。
FragmentはHTMLにレンダリングされる際には存在しない仮のメソッドです。
そのためFlexboxやGridなどのCSSスタイルを利用する際に、構造を壊さず利用できます。