- DAY 22:条件付きレンダリング 前半 ― 「状態によって画面を変える」力を身につける
- 条件付きレンダリングとは何か
- if文で条件付きレンダリングを行う基本パターン
- 三項演算子で「1行で条件付き表示」を書く
- && を使った「あるときだけ表示する」パターン
- 表示・非表示をStateで切り替える
- if・三項演算子・&& の使い分けをまとめる
- DAY 22 前半のまとめ
- DAY 22:条件付きレンダリング 中盤 ― 「現実的なログイン画面」を頭の中で組み立てる
- ログイン状態を「1つのBoolean」から始める
- ifで「画面全体の分岐」を書いてみる
- 三項演算子で「部分的な表示」を切り替える
- && で「あるときだけ表示する」要素を作る
- 表示・非表示を「複数の条件」で考えてみる
- if・三項演算子・&& の使い分けをもう一度まとめる
- 練習用テンプレート:ログイン状態+メッセージ表示
- DAY 22 中盤のまとめ
- DAY 22:条件付きレンダリング 後半 ― 「ログイン状態表示」を自分で設計できるところまで仕上げる
- 条件付きレンダリングは「状態の物語」をコードにすること
- 状態をStateとして定義する
- ifで「大きな分岐」を書き、三項演算子と&&で「細かい表示」を調整する
- 同じコンポーネント内で「部分的な表示」を三項演算子と&&で調整する
- 読みにくい条件付きレンダリングを避けるコツ
- コンポーネント分割で「条件付きレンダリングの責務」を分ける
- 練習用テンプレート:ログイン状態表示(完成版)
- DAY 22 後半のまとめ
DAY 22:条件付きレンダリング 前半 ― 「状態によって画面を変える」力を身につける
DAY 22では、Reactでとても重要な考え方である条件付きレンダリングを学びます。 ここからが「Stateを使いこなす」ための本格的な入り口であり、UIを“賢く”動かすための必須スキルになります。
この前半では、次のキーワードを軸に進めていきます。
if- 三項演算子(
条件 ? 真のとき : 偽のとき) &&(AND演算子を使った簡易的な条件付き表示)- 表示・非表示の切り替え
- 制作テーマ:ログイン状態表示
すべて、「ログインしているかどうかで表示を変える」という分かりやすい題材に乗せて解説していきます。
条件付きレンダリングとは何か
「状態に応じて、出すUIを変える」ことです
条件付きレンダリングとは、 Stateや値の状態に応じて、表示するコンポーネントやテキストを切り替えることです。
例えば、次のような場面をイメージしてみてください。
- ログインしているとき → 「こんにちは、ユーザーさん」と表示する
- ログインしていないとき → 「ログインしてください」と表示する
このような「状態によって表示を変える」ことが、条件付きレンダリングです。 Reactでは、JavaScriptの条件分岐(if、三項演算子、&&)を使ってこれを実現します。
if文で条件付きレンダリングを行う基本パターン
コンポーネントの中で「どのUIを返すか」を分ける
まずは、最も素直な書き方である if 文を使った条件付きレンダリングを見ていきます。
function LoginStatus({ isLoggedIn }) {
if (isLoggedIn) {
return <p>ログインしています。</p>;
}
return <p>ログインしていません。</p>;
}
JSXここで起きていることをステップで整理します。
LoginStatusコンポーネントは、isLoggedInというBooleanのPropsを受け取ります。if (isLoggedIn)で「ログインしているかどうか」を判定します。- ログインしている場合は
<p>ログインしています。</p>を返します。 - そうでない場合は
<p>ログインしていません。</p>を返します。
Reactコンポーネントは「何を返すか」でUIが決まるので、 if文で「返すもの」を分けることが、そのまま条件付きレンダリングになります。
親コンポーネントから使う例
function App() {
const isLoggedIn = true; // 仮の状態
return (
<div>
<h2>ログイン状態表示</h2>
<LoginStatus isLoggedIn={isLoggedIn} />
</div>
);
}
JSXこのように、親コンポーネントから isLoggedIn を渡すことで、 ログイン状態に応じた表示を行うことができます。
三項演算子で「1行で条件付き表示」を書く
条件 ? 真のとき : 偽のとき の形で書く
次に、三項演算子を使った条件付きレンダリングを見ていきます。 これは、「if文を短く書いた形」だと考えると分かりやすいです。
function LoginStatus({ isLoggedIn }) {
return (
<p>
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}
</p>
);
}
JSXここで起きていることは次の通りです。
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}isLoggedInがtrueのとき →"ログインしています。"isLoggedInがfalseのとき →"ログインしていません。"
つまり、先ほどの if 文と同じことを、1行で書いているだけです。
三項演算子のメリット
- 短く書けるので、シンプルな条件付き表示に向いています。
- JSXの中で直接使えるので、「テキストだけ切り替えたい」場面にぴったりです。
使い分けのイメージ
- UI全体を切り替えたい →
if文でreturnを分ける - 一部のテキストや小さな要素だけ切り替えたい → 三項演算子を使う
このように使い分けると、コードが読みやすくなります。
&& を使った「あるときだけ表示する」パターン
「条件がtrueのときだけ表示する」書き方
次に、&&(AND演算子)を使った条件付きレンダリングを見ていきます。 これは、「ある条件がtrueのときだけ、特定の要素を表示したい」場面でよく使われます。
function WelcomeMessage({ isLoggedIn }) {
return (
<div>
<h2>ようこそ</h2>
{isLoggedIn && <p>ログインありがとうございます!</p>}
</div>
);
}
JSXここでのポイントは、
isLoggedIn && <p>ログインありがとうございます!</p>isLoggedInがtrueのとき →<p>ログインありがとうございます!</p>が表示されます。isLoggedInがfalseのとき →falseになり、何も表示されません。
&& を使うと、「条件がtrueのときだけ表示する」というパターンを簡潔に書けます。
よくある使いどころ
- ログインしているときだけ「ようこそ、〇〇さん」を表示する
- エラーがあるときだけエラーメッセージを表示する
- 特定のフラグが立っているときだけ追加情報を表示する
など、「あるときだけ出したいUI」にとても便利です。
表示・非表示をStateで切り替える
ログイン状態をStateで管理して、表示を変える
ここまでの話を、実際のStateと組み合わせて「ログイン状態表示」のミニアプリにしてみます。
import { useState } from "react";
function LoginStatus({ isLoggedIn }) {
return (
<p>
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}
</p>
);
}
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
};
return (
<div>
<h2>ログイン状態表示</h2>
<LoginStatus isLoggedIn={isLoggedIn} />
<div style={{ marginTop: "8px" }}>
{isLoggedIn ? (
<button onClick={handleLogout}>ログアウト</button>
) : (
<button onClick={handleLogin}>ログイン</button>
)}
</div>
{isLoggedIn && <p>ログイン中のユーザー向けメッセージです。</p>}
</div>
);
}
export default LoginApp;
JSXこのコードで使われている条件付きレンダリングを整理する
- 三項演算子でテキストを切り替えjsx
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}ログイン状態に応じて、表示するメッセージを切り替えています。 - 三項演算子でボタンを切り替えjsx
{isLoggedIn ? ( <button onClick={handleLogout}>ログアウト</button> ) : ( <button onClick={handleLogin}>ログイン</button> )}- ログインしているとき → 「ログアウト」ボタンを表示
- ログインしていないとき → 「ログイン」ボタンを表示
&&で「ログイン中だけ表示するメッセージ」を出すjsx{isLoggedIn && <p>ログイン中のユーザー向けメッセージです。</p>}ログインしているときだけ、追加メッセージを表示しています。- Stateでログイン状態を管理jsx
const [isLoggedIn, setIsLoggedIn] = useState(false);- 初期状態は「ログインしていない」(
false) handleLoginでtrueにするhandleLogoutでfalseに戻す
- 初期状態は「ログインしていない」(
このように、State+条件付きレンダリングを組み合わせることで、 「ログイン状態に応じてUIが変わる」ミニアプリが自然に作れます。
if・三項演算子・&& の使い分けをまとめる
それぞれの得意な場面
- if文
- コンポーネントの中で「どのUIを返すか」を大きく分けたいときに使います。
- 例:ログインしているときはダッシュボード、していないときはログイン画面を返す。
- 三項演算子
- テキストや小さな要素を「AかBか」で切り替えたいときに使います。
- 例:ログイン状態メッセージ、ボタンのラベル、アイコンなど。
&&- 「ある条件がtrueのときだけ表示したい」要素に使います。
- 例:ログイン中だけ表示する追加メッセージ、エラーがあるときだけ出す警告など。
大事な考え方
条件付きレンダリングは、 「今のStateに応じて、どのUIを見せるべきか」をコードで表現することです。
- Stateが「ログインしている」なら、このUI
- Stateが「ログインしていない」なら、別のUI
- Stateが「エラーあり」なら、エラーメッセージを表示
- Stateが「読み込み中」なら、ローディング表示
というように、状態とUIを結びつけるのがReactの本質です。
DAY 22 前半のまとめ
DAY 22の前半では、
- 条件付きレンダリングとは「状態に応じて表示を変えること」であり、ReactではJavaScriptの条件分岐を使ってそれを実現すること
if文でコンポーネントの返り値を分けることで、大きなUIの切り替えができること- 三項演算子を使うことで、テキストや小さな要素の切り替えをシンプルに書けること
&&を使うことで、「ある条件がtrueのときだけ表示する」パターンを簡潔に書けること- ログイン状態表示のミニアプリを通して、State+条件付きレンダリングの組み合わせを具体的なコードとしてイメージできるようになったこと
が大きなポイントになります。
読者のみなさんが、この段階で、
- 「ログインしているかどうかで表示を変える」
- 「ON/OFFでメッセージを出し分ける」
- 「エラーがあるときだけ警告を出す」
といったUIを自分で書けるようになっていると、 Reactの画面設計は一気に楽しく、そして実用的なものになっていきます。
次の中盤では、条件付きレンダリングをさらに発展させて、 複数の状態・複数のコンポーネントを組み合わせた画面設計へと進んでいきます。
DAY 22:条件付きレンダリング 中盤 ― 「現実的なログイン画面」を頭の中で組み立てる
DAY 22の中盤では、前半で学んだ条件付きレンダリングを、 もう一歩「実際のアプリに近い形」まで持っていきます。
テーマは引き続き ログイン状態表示 ですが、 単に「ログインしています/していません」を出すだけでなく、
- ボタンの表示切り替え
- メッセージの表示・非表示
- 複数の条件を組み合わせた分岐
などを通して、if・三項演算子・&& の使い分けを体で覚えることを目指します。
ログイン状態を「1つのBoolean」から始める
まずは軸となるStateを決める
条件付きレンダリングを考えるときは、 まず「何を軸に画面を変えるか」を決めるところから始めます。
ログイン状態表示なら、軸となるStateはとてもシンプルです。
const [isLoggedIn, setIsLoggedIn] = useState(false);
JSXisLoggedIn→ ログインしているかどうか(true/false)setIsLoggedIn→ ログイン状態を変更するための関数
この1つのBooleanを中心に、 「何を表示するか」「何を隠すか」を決めていきます。
ifで「画面全体の分岐」を書いてみる
ログインしているときと、していないときでUIを丸ごと変える
まずは、if を使って「画面全体の分岐」を書くパターンです。
import { useState } from "react";
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
};
if (isLoggedIn) {
return (
<div>
<h2>ログイン状態表示</h2>
<p>ログインしています。</p>
<button onClick={handleLogout}>ログアウト</button>
<p>ログイン中のユーザー向けメニューがここに表示されます。</p>
</div>
);
}
return (
<div>
<h2>ログイン状態表示</h2>
<p>ログインしていません。</p>
<button onClick={handleLogin}>ログイン</button>
<p>ログインすると、ユーザー専用メニューが表示されます。</p>
</div>
);
}
export default LoginApp;
JSXこの書き方の特徴
if (isLoggedIn)の中で「ログインしているときのUI」を丸ごと返しています。returnを2つ書くことで、「ログインしているとき」と「していないとき」で画面全体を切り替えています。
ポイント:
- 「画面の構造そのものが変わる」ような場面では、
ifでreturnを分けると読みやすくなります。 - ログイン画面とダッシュボードのように、まったく別のUIを出したいときに向いているパターンです。
三項演算子で「部分的な表示」を切り替える
同じコンポーネント内で、テキストやボタンだけを切り替える
次に、画面全体ではなく「一部の表示だけ」を切り替えるパターンを見ていきます。
import { useState } from "react";
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
};
return (
<div>
<h2>ログイン状態表示</h2>
<p>
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}
</p>
{isLoggedIn ? (
<button onClick={handleLogout}>ログアウト</button>
) : (
<button onClick={handleLogin}>ログイン</button>
)}
</div>
);
}
export default LoginApp;
JSX三項演算子の使いどころ
- テキストを「AかBか」で切り替えたいとき
- ボタンを「ログイン/ログアウト」で切り替えたいとき
- アイコンやラベルなど、小さなUI要素を切り替えたいとき
ポイント:
- 三項演算子は「1つの場所で2パターンを切り替える」場面に向いています。
- 「この部分だけAかBかを変えたい」というときに使うと、コードがコンパクトになります。
&& で「あるときだけ表示する」要素を作る
ログイン中だけ見せたいメッセージを追加する
次に、「ログインしているときだけ表示したいメッセージ」を追加してみます。
import { useState } from "react";
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
};
return (
<div>
<h2>ログイン状態表示</h2>
<p>
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}
</p>
{isLoggedIn ? (
<button onClick={handleLogout}>ログアウト</button>
) : (
<button onClick={handleLogin}>ログイン</button>
)}
{isLoggedIn && (
<p style={{ marginTop: "8px" }}>
ログイン中のユーザー向けメッセージです。
</p>
)}
</div>
);
}
export default LoginApp;
JSX&& の意味を丁寧に分解する
{isLoggedIn && <p>...</p>} は、次のように動きます。
isLoggedInがtrueのときtrue && <p>...</p>→<p>...</p>が評価されて表示されます。
isLoggedInがfalseのときfalse && <p>...</p>→falseになり、Reactは何も表示しません。
ポイント:
- 「ある条件がtrueのときだけ表示したい」要素には、
条件 && 要素という形がとても便利です。 - エラーメッセージ、注意書き、追加情報など、「なくてもいいけれど、条件次第で出したいもの」に向いています。
表示・非表示を「複数の条件」で考えてみる
ログイン状態+別のフラグを組み合わせる
中盤では、少しだけ条件を増やしてみます。 例えば、「ログインしていて、かつメール認証が終わっているときだけ表示するメッセージ」を考えてみます。
import { useState } from "react";
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [isEmailVerified, setIsEmailVerified] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
setIsEmailVerified(false);
};
const handleVerifyEmail = () => {
setIsEmailVerified(true);
};
return (
<div>
<h2>ログイン状態表示(メール認証付き)</h2>
<p>
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}
</p>
{isLoggedIn ? (
<button onClick={handleLogout}>ログアウト</button>
) : (
<button onClick={handleLogin}>ログイン</button>
)}
{isLoggedIn && !isEmailVerified && (
<div style={{ marginTop: "8px" }}>
<p>メール認証がまだ完了していません。</p>
<button onClick={handleVerifyEmail}>メール認証を完了する</button>
</div>
)}
{isLoggedIn && isEmailVerified && (
<p style={{ marginTop: "8px" }}>
メール認証済みユーザー向けメニューが表示されます。
</p>
)}
</div>
);
}
export default LoginApp;
JSX条件を言葉で整理する
- ログインしていない → ログインボタンだけ表示
- ログインしている & メール認証が未完了 → 認証を促すメッセージ+ボタンを表示
- ログインしている & メール認証が完了 → 認証済みユーザー向けメッセージを表示
このように、複数のBooleanを組み合わせて「どのUIを出すか」を決めるのが条件付きレンダリングの本質です。
ポイント:
- 条件が増えたときは、「状態を日本語で整理してからコードにする」と混乱しにくくなります。
isLoggedIn && !isEmailVerifiedのように、&&と!を組み合わせることで、細かい条件を表現できます。
if・三項演算子・&& の使い分けをもう一度まとめる
実際のログイン状態表示を例にした使い分け
- if
- ログインしているときはダッシュボード、していないときはログイン画面など、 「コンポーネント全体を切り替える」ときに使います。
- 三項演算子
- ログイン状態メッセージ、ボタンのラベル、アイコンなど、 「1つの場所でAかBかを切り替える」ときに使います。
&&- ログイン中だけ表示するメッセージ、認証未完了のときだけ出す警告など、 「ある条件がtrueのときだけ表示したい要素」に使います。
この3つを「どれが正解か」ではなく、 「どの場面にどれがしっくりくるか」で選ぶ感覚を持てると、Reactのコードがぐっと読みやすくなります。
練習用テンプレート:ログイン状態+メッセージ表示
最後に、DAY 22中盤の内容をコンパクトにまとめた練習用テンプレートを示します。
import { useState } from "react";
function LoginStatus({ isLoggedIn }) {
return (
<p>
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}
</p>
);
}
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
};
return (
<div>
<h2>ログイン状態表示</h2>
<LoginStatus isLoggedIn={isLoggedIn} />
<div style={{ marginTop: "8px" }}>
{isLoggedIn ? (
<button onClick={handleLogout}>ログアウト</button>
) : (
<button onClick={handleLogin}>ログイン</button>
)}
</div>
{isLoggedIn && (
<p style={{ marginTop: "8px" }}>
ログイン中のユーザー向けメッセージです。
</p>
)}
</div>
);
}
export default LoginApp;
JSXこのテンプレートの中には、
ifで全体を分ける代わりに、三項演算子と&&で部分的に切り替えるパターン- Stateを軸にした表示・非表示の制御
- コンポーネント分割(
LoginStatus)とPropsによる状態の受け渡し
が自然に含まれています。
DAY 22 中盤のまとめ
DAY 22の中盤では、
- ログイン状態という分かりやすい題材を使って、条件付きレンダリングを「画面全体」「部分的な表示」「あるときだけ表示」という3つのレベルで考えたこと
if・三項演算子・&&のそれぞれの得意な場面と、使い分けの感覚を具体的なコードで確認したこと- 複数のBoolean(ログイン状態+メール認証状態)を組み合わせて、現実的なUIの分岐を表現する練習をしたこと
- Stateを軸に「今の状態にふさわしいUIを出す」というReactの本質的な考え方を、ログイン状態表示を通して体感したこと
が大きなポイントになります。
この段階まで来ると、
- 「状態によって画面を変える」
- 「あるときだけ表示する」
- 「複数条件で分岐する」
といったUI設計が、自分の頭の中で自然に組み立てられるようになっていきます。
DAY 22:条件付きレンダリング 後半 ― 「ログイン状態表示」を自分で設計できるところまで仕上げる
DAY 22の後半では、条件付きレンダリングを「なんとなく分かった」から 「自分で設計して、迷わず書ける」レベルまで持っていくことを目標にします。
テーマは引き続き ログイン状態表示 ですが、後半では次のようなポイントを意識して進めていきます。
if・三項演算子・&&の使い分けを、意図を持って選べるようにする- 「表示・非表示」を、Stateと結びつけて設計できるようにする
- 実際のログイン画面に近いミニアプリを完成させる
- よくある「読みにくい条件付きレンダリング」を避ける感覚を身につける
条件付きレンダリングは「状態の物語」をコードにすること
まずは「状態」を日本語で整理する
ログイン状態表示を作るとき、いきなりコードを書き始めるのではなく、 「どんな状態があり、それぞれのときに何を見せたいか」を日本語で整理するところから始めると、条件付きレンダリングがぐっと楽になります。
例えば、次のような状態を考えます。
- ログインしていない
- ログインしているが、メール認証がまだ
- ログインしていて、メール認証も完了している
それぞれの状態で、画面に何を表示したいかを言葉で書き出します。
- 1 → 「ログインしていません」「ログインボタン」
- 2 → 「ログインしています」「メール認証が未完了です」「認証ボタン」
- 3 → 「ログインしています」「メール認証済みです」「ユーザー専用メニュー」
この「状態の物語」を、if・三項演算子・&& を使ってコードにしていくイメージです。
状態をStateとして定義する
Booleanを組み合わせて「今の状態」を表現する
先ほどの3つの状態は、次の2つのBooleanで表現できます。
isLoggedIn→ ログインしているかどうかisEmailVerified→ メール認証が完了しているかどうか
これをReactのStateとして定義します。
import { useState } from "react";
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [isEmailVerified, setIsEmailVerified] = useState(false);
// ...
}
JSXここから、「この2つのStateの組み合わせに応じて、何を表示するか」を決めていきます。
ifで「大きな分岐」を書き、三項演算子と&&で「細かい表示」を調整する
3つの状態をifで分ける
まずは、3つの状態を if で分けるパターンを見てみます。
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [isEmailVerified, setIsEmailVerified] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
setIsEmailVerified(false);
};
const handleVerifyEmail = () => {
setIsEmailVerified(true);
};
if (!isLoggedIn) {
// 状態1:ログインしていない
return (
<div>
<h2>ログイン状態表示</h2>
<p>ログインしていません。</p>
<button onClick={handleLogin}>ログイン</button>
<p>ログインすると、ユーザー専用メニューが表示されます。</p>
</div>
);
}
if (isLoggedIn && !isEmailVerified) {
// 状態2:ログインしているが、メール認証がまだ
return (
<div>
<h2>ログイン状態表示</h2>
<p>ログインしています。</p>
<p>メール認証がまだ完了していません。</p>
<button onClick={handleLogout}>ログアウト</button>
<button onClick={handleVerifyEmail}>メール認証を完了する</button>
</div>
);
}
// 状態3:ログインしていて、メール認証も完了している
return (
<div>
<h2>ログイン状態表示</h2>
<p>ログインしています。</p>
<p>メール認証済みです。</p>
<button onClick={handleLogout}>ログアウト</button>
<p>認証済みユーザー向けメニューがここに表示されます。</p>
</div>
);
}
JSXこの書き方のメリット
- 「状態1」「状態2」「状態3」が、コード上でもはっきり分かれています。
- それぞれの状態で、返すUIが丸ごと違うことが一目で分かります。
重要ポイント:
- 状態がはっきり分かれていて、画面全体が変わるときは、
ifでreturnを分けると読みやすくなります。 - 「今はどの状態か」を頭の中で追いやすくなり、バグも減ります。
同じコンポーネント内で「部分的な表示」を三項演算子と&&で調整する
1つの画面の中で、細かい表示を切り替える
今度は、画面全体を分けるのではなく、 1つのコンポーネントの中で、部分的な表示を三項演算子と&&で切り替えるパターンを見てみます。
import { useState } from "react";
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [isEmailVerified, setIsEmailVerified] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
setIsEmailVerified(false);
};
const handleVerifyEmail = () => {
setIsEmailVerified(true);
};
return (
<div>
<h2>ログイン状態表示</h2>
{/* ログイン状態メッセージ */}
<p>
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}
</p>
{/* ログイン/ログアウトボタン */}
<div style={{ marginBottom: "8px" }}>
{isLoggedIn ? (
<button onClick={handleLogout}>ログアウト</button>
) : (
<button onClick={handleLogin}>ログイン</button>
)}
</div>
{/* メール認証関連の表示 */}
{isLoggedIn && !isEmailVerified && (
<div style={{ marginBottom: "8px" }}>
<p>メール認証がまだ完了していません。</p>
<button onClick={handleVerifyEmail}>メール認証を完了する</button>
</div>
)}
{isLoggedIn && isEmailVerified && (
<p>メール認証済みユーザー向けメニューが表示されます。</p>
)}
</div>
);
}
export default LoginApp;
JSXここでの使い分けを整理する
- 三項演算子
- ログイン状態メッセージ
- ログイン/ログアウトボタン → 「AかBか」の切り替えに使っています。
&&- ログイン中かつメール認証未完了 → 認証を促すメッセージ+ボタン
- ログイン中かつメール認証完了 → 認証済みユーザー向けメッセージ → 「ある条件のときだけ表示する」要素に使っています。
重要ポイント:
- 三項演算子は「2パターンのどちらかを出す」場面に向いています。
&&は「出すか出さないか」の場面に向いています。- 1つのコンポーネントの中で、これらを組み合わせることで、柔軟な表示・非表示が実現できます。
読みにくい条件付きレンダリングを避けるコツ
条件が複雑になりすぎたら「名前を付ける」
条件付きレンダリングをしていると、 つい次のような書き方をしてしまうことがあります。
{isLoggedIn && isEmailVerified && !isAdmin && someFlag && (
<p>何かのメッセージ</p>
)}
JSXこれでは、「どんな状態のときに表示されるのか」が一目で分かりにくくなります。
こういうときは、条件に名前を付けるのが有効です。
const canShowUserMessage =
isLoggedIn && isEmailVerified && !isAdmin && someFlag;
{canShowUserMessage && <p>何かのメッセージ</p>}
JSXこうすると、
- 「このメッセージは、
canShowUserMessageのときに表示される」 canShowUserMessageの中身を別の場所で落ち着いて読める
という形になり、コードの意図が伝わりやすくなります。
ポイント:
- 条件が長くなってきたら、「その条件が意味する状態」に名前を付ける。
- 名前は「状態を日本語で説明したときの言葉」から取ると分かりやすくなります。
コンポーネント分割で「条件付きレンダリングの責務」を分ける
ログイン状態表示を小さな部品に分ける
条件付きレンダリングが増えてきたら、 コンポーネントを分割して、それぞれに役割を持たせるのも有効です。
function LoginMessage({ isLoggedIn }) {
return (
<p>
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}
</p>
);
}
function LoginButton({ isLoggedIn, onLogin, onLogout }) {
return isLoggedIn ? (
<button onClick={onLogout}>ログアウト</button>
) : (
<button onClick={onLogin}>ログイン</button>
);
}
function EmailStatus({ isLoggedIn, isEmailVerified, onVerify }) {
if (!isLoggedIn) {
return null;
}
if (!isEmailVerified) {
return (
<div style={{ marginTop: "8px" }}>
<p>メール認証がまだ完了していません。</p>
<button onClick={onVerify}>メール認証を完了する</button>
</div>
);
}
return (
<p style={{ marginTop: "8px" }}>
メール認証済みユーザー向けメニューが表示されます。
</p>
);
}
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [isEmailVerified, setIsEmailVerified] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
setIsEmailVerified(false);
};
const handleVerifyEmail = () => {
setIsEmailVerified(true);
};
return (
<div>
<h2>ログイン状態表示</h2>
<LoginMessage isLoggedIn={isLoggedIn} />
<LoginButton
isLoggedIn={isLoggedIn}
onLogin={handleLogin}
onLogout={handleLogout}
/>
<EmailStatus
isLoggedIn={isLoggedIn}
isEmailVerified={isEmailVerified}
onVerify={handleVerifyEmail}
/>
</div>
);
}
JSXこの分割の意味
LoginMessage→ ログイン状態メッセージだけを担当LoginButton→ ログイン/ログアウトボタンだけを担当EmailStatus→ メール認証に関する表示だけを担当
それぞれのコンポーネントが「自分の責務の中で条件付きレンダリングを行う」形になっています。
重要ポイント:
- 条件付きレンダリングが増えてきたら、「何を担当するコンポーネントか」を意識して分割する。
- 1つのコンポーネントに条件を詰め込みすぎると、読みにくく・壊れやすくなります。
練習用テンプレート:ログイン状態表示(完成版)
最後に、DAY 22後半の内容をまとめた「完成版テンプレート」を示します。
import { useState } from "react";
function LoginMessage({ isLoggedIn }) {
return (
<p>
{isLoggedIn ? "ログインしています。" : "ログインしていません。"}
</p>
);
}
function LoginButton({ isLoggedIn, onLogin, onLogout }) {
return (
<div style={{ marginBottom: "8px" }}>
{isLoggedIn ? (
<button onClick={onLogout}>ログアウト</button>
) : (
<button onClick={onLogin}>ログイン</button>
)}
</div>
);
}
function EmailStatus({ isLoggedIn, isEmailVerified, onVerify }) {
if (!isLoggedIn) {
return null;
}
if (!isEmailVerified) {
return (
<div style={{ marginTop: "8px" }}>
<p>メール認証がまだ完了していません。</p>
<button onClick={onVerify}>メール認証を完了する</button>
</div>
);
}
return (
<p style={{ marginTop: "8px" }}>
メール認証済みユーザー向けメニューが表示されます。
</p>
);
}
function LoginApp() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [isEmailVerified, setIsEmailVerified] = useState(false);
const handleLogin = () => {
setIsLoggedIn(true);
};
const handleLogout = () => {
setIsLoggedIn(false);
setIsEmailVerified(false);
};
const handleVerifyEmail = () => {
setIsEmailVerified(true);
};
return (
<div>
<h2>ログイン状態表示</h2>
<LoginMessage isLoggedIn={isLoggedIn} />
<LoginButton
isLoggedIn={isLoggedIn}
onLogin={handleLogin}
onLogout={handleLogout}
/>
<EmailStatus
isLoggedIn={isLoggedIn}
isEmailVerified={isEmailVerified}
onVerify={handleVerifyEmail}
/>
</div>
);
}
export default LoginApp;
JSXDAY 22 後半のまとめ
DAY 22の後半では、
- 条件付きレンダリングを「状態の物語」として捉え、まず日本語で整理してからコードにする考え方を確認したこと
if・三項演算子・&&を、画面全体の分岐・部分的な表示・あるときだけ表示という役割に分けて使い分けたこと- 複数のBoolean(ログイン状態・メール認証状態)を組み合わせて、現実的なログインUIを表現したこと
- 条件が複雑になったときに「名前を付ける」「コンポーネントを分割する」ことで、読みやすさと保守性を高める方法を学んだこと
- ログイン状態表示の完成版テンプレートを通して、State+条件付きレンダリング+コンポーネント分割を一つの流れとして理解できるようになったこと
が大きなポイントになります。
この段階まで来ると、「状態によってUIを変える」というReactの本質的な力を、 自分の手でコントロールできる感覚がかなり育っているはずです。
