Day 3・リスト・条件・フォーム — 実データを画面に出す
条件付きレンダリング(出し分け)
&& と三項演算子を使って、状態に応じて表示する内容を切り替える。
「今の状態」で見せるものを変える
画面は常に同じものを見せているわけではありません。読み込み中はスピナー、ログイン済みならユーザー名、未ログインならログインボタン。こうした「状態によって表示を出し分ける」ことを条件付きレンダリングと呼びます。JSX の中では if 文を直接書けないので、JavaScript の式である && や三項演算子を使います。
まずは「条件が真のときだけ表示する」パターン。論理積 && を使います。左が true のときだけ右の JSX が描画され、false のときは何も表示されません。
function Panel({ isLoading }: { isLoading: boolean }) {
return (
<div>
{isLoading && <Spinner />}
<p>本文</p>
</div>
);
}次は「A か B のどちらかを出す」パターン。三項演算子 条件 ? A : B を使います。条件が true なら A、false なら B が描画されます。ログイン状態での出し分けが典型例です。
function Header({ isLoggedIn }: { isLoggedIn: boolean }) {
return (
<header>
{isLoggedIn ? <p>ようこそ!</p> : <button>ログイン</button>}
</header>
);
}なぜ if 文でなく式を使うのか
JSX の {} の中には「値を返す式」しか置けません。if 文は値を返さない文なので、そのままは埋め込めません。&& や三項演算子は「JSX という値を返す式」なので {} の中に置けます。どうしても if で書きたいときは、return の前で分岐して変数に入れておき、JSX ではその変数を使う、という書き方をします。
&& の左は boolean にする
{items.length && <List />} のように書くと、length が 0 のとき画面に 0 が表示されてしまいます。数値や文字列は「そのまま値として出る」ためです。{items.length > 0 && <List />} のように、左を必ず true/false になる比較にしておくと安全です。
数値をそのまま && の左に置く
0 のとき画面に 0 が出てしまう
{count && <Badge count={count} />}比較して boolean にする
0 のときは何も出ない
{count > 0 && <Badge count={count} />}- 条件が真のときだけ出す → 条件 && <要素 />
- AかBのどちらかを出す → 条件 ? <A /> : <B />
- JSX の {} には「式」しか置けないので if 文は使えない
- && の左は数値でなく比較(> 0 など)にして 0 の表示を防ぐ
AIにはこう聞く
「isLoading が true のときだけスピナーを出し、ログイン状態でヘッダーの表示を出し分けたい。&& と三項演算子で書いて」と頼むと意図どおりの分岐が返ります。0 が表示される不具合が出たら「条件のところに 0 が表示される。原因と直し方を教えて」と聞きましょう。
読んでも腑に落ちない所は、AIに噛み砕いてもらいましょう。
理解度チェック
答えられれば、面接で説明できる状態に一歩近づきます。
「条件が true のときだけ <Spinner /> を表示する」書き方はどれ?
{items.length && <List />} と書いたとき、items が空(length が 0)だと起こることはどれ?
JSX の中で if 文が使えず、代わりに && や三項演算子を使うのはなぜか説明してください。
記述式です。まず自分の言葉で答えを考えてから、模範解答を開いて自己採点してください。