いま8羽が同じ形で並んでいます。ここに条件を足します。
- レアな鳥(
rareが3以上)にだけ「レア」バッジを出す - 説明が空の鳥には「せつめいはじゅんび中」と出す
JSXの中ではif文が使えないので、式で書ける条件分岐を使います。
&&——あるときだけ出す
「条件に合うときだけ出す」は&&が定番です。
{rare >= 3 && <span className="badge">レア</span>}&&は、左が真なら右を返し、偽なら左を返すという演算子です。返ってきた値がJSXならそれが表示され、falseならReactは何も表示しません。
Reactが画面に出さない値は次の4つです。
| 値 | 表示 |
|---|---|
false / true | 何も出ない |
null | 何も出ない |
undefined | 何も出ない |
0 | 0と出る |
最後の1行が、次の落とし穴の正体です。
三項演算子——AかBかを出し分ける
「無いときは代わりにこれ」なら三項演算子です。
{memo ? (
<p className="mt-1 text-sm text-slate-600">{memo}</p>
) : (
<p className="mt-1 text-sm text-slate-400 italic">せつめいはじゅんび中</p>
)}条件 ? 真のとき : 偽のとき。JSXが長くなるのでかっこで囲んで改行します。
入れ子にはしないのがコツです。3つ以上に分かれるなら、次の書き方に逃がします。
returnより前でifを使う
JSXの外ならif文がふつうに書けます。分岐が複雑になったら、変数に入れてから差しこみます。
function RareBadge({ rare }) {
let label = null
if (rare >= 3) label = 'レア'
else if (rare === 2) label = 'ときどき見る'
return label && <span className="badge">{label}</span>
}「そもそも何も出さない」ときは、早めにreturnするのがいちばん読みやすくなります。
function BirdCard({ bird }) {
if (!bird) return null // データが無いなら何も描かない
return <div>…</div>
}nullを返すと、Reactはそのコンポーネントを何も出力しません。「読みこみ中は一覧を出さない」のような分岐でも、この形をよく使います。
条件でクラス名を変える
出し分けるのは要素だけではありません。同じ要素の見た目だけを条件で変えたい——お気に入りのカードだけ色を変える、といった場面です。
classNameも波かっこで書けるので、三項演算子がそのまま使えます。
<div className={isFavorite ? 'bg-amber-50' : 'bg-white'}>共通のクラスと、条件で変わるクラスを混ぜたいときは、テンプレートリテラルでつなぎます。
<div className={`rounded-2xl p-5 shadow-sm ${isFavorite ? 'bg-amber-50' : 'bg-white'}`}>propsが増えてきたら、まとめて渡す
いまBirdCardには4つのpropsを渡しています。バッジのためにrareも要るので5つです。並べ続けるとApp.jsxが長くなります。
// これまで
<BirdCard name={bird.name} emoji={bird.emoji} area={bird.area} memo={bird.memo} rare={bird.rare} />
// オブジェクトごと渡す
<BirdCard bird={bird} />受け取る側で分割代入すれば、中の書き方は変わりません。
function BirdCard({ bird }) {
const { name, emoji, area, memo, rare } = bird
…
}公式ドキュメントも見てみる
ja.react.dev外部サイト条件付きレンダー – React公式の「条件付きレンダー」。「論理AND演算子(&&)」の節に、0が表示されてしまう罠の説明もありますこのレッスンのまとめ
- 「あるときだけ出す」は
&&、「AかBか」は三項演算子。classNameにもそのまま使える - Reactは
false・null・undefinedを表示しないが、0は表示する - だから
{配列.length && …}は危険——> 0を付けて真偽値にする - 複雑な分岐はJSXの外で
if。何も出さないときはreturn null - propsが増えて、しかも元が1つのオブジェクトなら
bird={bird}とまとめて渡す
次からは章が変わって、画面が動き出します。押したら変わる値——stateの回です。
