はじめに|Reactで条件分岐に悩んだ話

ReactでUIを作っていると、必ず出てくるのが「条件によって表示を切り替える」処理です。
あなたも一度は「if文で書ける?」「三項演算子の方がいい?」「&&ってなに?」と悩んだことがあるはず。
この記事では、その疑問を整理してスッキリ解決できるようにまとめます。
この記事では、Reactの条件分岐レンダリングを「if文」「三項演算子」「短絡評価(&&)」の3本柱で、コード全文 → 抜粋 → 丁寧な解説の順に、やさしく整理します。
方法①:Reactで if 文を使って条件分岐する(読みやすさ重視)
コード全文
import { useState } from "react";
function Profile() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);
  // 早期returnパターン(おすすめ)
  if (!isLoggedIn) {
    return (
      <div>
        <h2>ログインが必要です</h2>
        <button onClick={() => setIsLoggedIn(true)}>ログインする</button>
      </div>
    );
  }
  // ここに来るのは isLoggedIn === true のとき
  return (
    <div>
      <h2>ようこそ!</h2>
      <button onClick={() => setIsLoggedIn(false)}>ログアウト</button>
    </div>
  );
}
export default Profile;抜粋
if (!isLoggedIn) {
  return <LoginPrompt />;
}
return <Dashboard />;解説
- if文はJSXの“外”で使うのがコツ。return ( ... )の中にif (...) { ... }は置けません。
- 「早期 return(early return)」は分岐がはっきりして読みやすいのがメリット。
- 分岐が増えたら、さらに分岐ごとに小コンポーネントに分けると保守性が上がります。
もう1つの書き方:変数に一度代入してから返す
let content;
if (isLoggedIn) {
  content = <Dashboard />;
} else {
  content = <LoginPrompt />;
}
return <section>{content}</section>;- 一時変数 contentを使うと、後で共通のラップ(レイアウト)に入れやすいのが利点です。
方法②:Reactで三項演算子(条件 ? 真 : 偽)を使う
コード全文
import { useState } from "react";
function Greeting() {
  const [hour, setHour] = useState(9); // 0〜23
  return (
    <div>
      <p>
        {hour < 12 ? "おはようございます" : "こんにちは"}
      </p>
      <div style={{ marginTop: 8 }}>
        <button onClick={() => setHour(9)}>9時にする</button>
        <button onClick={() => setHour(15)} style={{ marginLeft: 8 }}>
          15時にする
        </button>
      </div>
    </div>
  );
}
export default Greeting;抜粋
{hour < 12 ? "おはようございます" : "こんにちは"}解説
- JSXの中で完結できるので、短い2択に向いています。
- ネスト(入れ子)が深くなると一気に読みにくくなるので、三項は1段までを目安に。
- 3択以上・複雑な条件はif文(early return)に戻すのが安全です。
ちょい応用:要素ごと切り替える
{isMobile ? <MobileNav /> : <DesktopNav />}方法③:Reactで短絡評価(条件 && JSX)を使う
コード全文
import { useState } from "react";
function Notifications() {
  const [unreadCount, setUnreadCount] = useState(3);
  return (
    <div>
      <h3>お知らせ</h3>
      {/* 条件を満たすときだけバッジを表示 */}
      {unreadCount > 0 && <span className="badge">{unreadCount}</span>}
      <div style={{ marginTop: 8 }}>
        <button onClick={() => setUnreadCount((n) => n + 1)}>+1</button>
        <button onClick={() => setUnreadCount(0)} style={{ marginLeft: 8 }}>
          既読にする
        </button>
      </div>
    </div>
  );
}
export default Notifications;抜粋
{unreadCount > 0 && <span className="badge">{unreadCount}</span>}解説
- 「条件を満たすなら出す、満たさなければ何も出さない」を1行で書けるのが魅力。
- elseが要らないとき(例:エラー時だけメッセージを出す)、最短で書けます。
よくある落とし穴(重要)
{unreadCount && <span>{unreadCount}</span>}- unreadCountが- 0のとき、- 0がそのまま描画されてしまいます(- false・- null・- undefinedは描画されませんが、- 0は描画されます)。
- 比較演算で明示しましょう。
{unreadCount > 0 && <span>{unreadCount}</span>}React条件分岐レンダリングの比較まとめ
| 方法 | 向いているケース | 読みやすさ | else の扱い | メモ | 
|---|---|---|---|---|
| if文(early return) | 分岐が複数・複雑 | 高い | もちろん可 | 迷ったらこれ。小コンポーネント化しやすい | 
| 三項演算子 | シンプルな二択 | 中(※1段まで) | ? A : B | 1段を超えたらifへ退避 | 
| 短絡評価(&&) | 「ある時だけ出す」 | 高い | なし | 0が描画される落とし穴に注意 | 
初心者がReactの条件分岐でつまずくポイント

1. return(...) の中で if {} を書こうとしてしまう
- JSX内は「式」だけ。if文はJSXの外で使います(early return or 代入)。
2. 三項演算子のネストで可読性が急落
- 二択を越えたらif文に戻すか、分岐ごとに小コンポーネントへ分割。
3. 条件 && JSX で 0 が表示される
- count && <Badge />は- count=0のとき 0が出力。- count > 0 && ...のように比較で明示する。
4. 条件分岐の中で setState を直に呼んで再レンダリング地獄
- レンダリング中に状態更新しないのが原則。更新はイベントハンドラやuseEffect内で。
5. Fallbackの書き方を誤る
- 「値がないときの代替表示」は ??(null合体)や三項で。
 例){title ?? "タイトル未設定"}
まとめ|Reactの条件分岐は“使い分け”が肝

- if文(early return):複雑・多分岐に強い。読みやすさ重視。
- 三項演算子:シンプルな二択を1行で。ネストは避ける。
- 短絡評価(&&):条件を満たすときだけ出す。0表示に注意。
この3つを場面ごとに使い分けられるようになると、ReactのUI設計がぐっと楽になります。
「読みやすさ」を最優先に、無理だと感じたらif文に戻す、分岐を小コンポーネントに切り出す——これが実務で効くコツだと思っています!















Reactの条件分岐レンダリングとは「ある条件のときだけUIを出す/出し分ける」ための書き方の総称です。
HTMLは“見た目の宣言”が主ですが、ReactではJSXの中でJavaScriptの式を使えるので、条件に応じて要素を切り替えられます。