[React] コンポーネントをレンダーしない場合の返却値は`null`と`<></>`のどちらであるべきか
3 min read
状況
コンポーネント内部の条件によって、コンポーネントをレンダーしないで欲しい場合がある。
条件によってnull
を返すコンポーネント:
const ReturnNullComponent = (isDisplay) => {
if (!isDisplay) {
return null;
}
return <>ReturnNullComponent</>;
};
条件によってフラグメントを返すコンポーネント:
const ReturnFragmentComponent = (isDisplay) => {
if (!isDisplay) {
return <></>;
}
return <>ReturnFragmentComponent</>;
};
結論
Reactの公式ドキュメントにもあるようにnull
を返すようにすることを推奨されている。
提示した例のような場合は、null
を返すのがより一般的である。
稀なケースですが、他のコンポーネントによってレンダーされているにも関わらず、コンポーネントが自分のことを隠したい、ということがあるかもしれません。その場合はレンダー出力の代わりに null を返すようにしてください。
null を使って何も返さないようにする
場合によっては、何もレンダーしたくないことがあります。例えば、梱包済みの荷物は一切表示したくない、という場合です。コンポーネントは常に何かを返す必要があります。このような場合、null を返すことができます。
null
の特徴
- コンポーネントは何もレンダリングしない
- DOMには何も追加されない
トランスパイルすると以下のようになる。
const ReturnNullComponent = (isDisplay) => {
if (!isDisplay) {
return null;
}
return /*#__PURE__*/ React.createElement(React.Fragment, null, 'ReturnNullComponent');
};
フラグメントの特徴
- コンポーネントは空のフラグメントをレンダリングする
- フラグメントは、DOM上は表示されないが仮想DOM(Reactのコンポーネントツリー)には存在する
先述のトランスパイルすると以下のようになる。
const ReturnFragmentComponent = (isDisplay) => {
if (!isDisplay) {
return /*#__PURE__*/ React.createElement(React.Fragment, null);
}
return /*#__PURE__*/ React.createElement(React.Fragment, null, 'ReturnFragmentComponent');
};
トランスパイルの設定によって多少異なるが、空のつもりでもフラグメントを返していることが分かる。