zukucode
主にWEB関連の情報を技術メモとして発信しています。

React 条件によって表示を切り替える

Reactでは、JavaScriptの条件式を使って表示する内容を切り替えます。

どの書き方が短いかだけで選ぶと、条件が増えたときに表示の優先順位が分かりにくくなります。読み込み、エラー、データなしのように画面全体が切り替わる状態は早期return、一部分の表示には三項演算子や&&を使い分けます。

if文で早めにreturnする

読み込み中やエラーの場合は、コンポーネントの先頭で表示を返すと分かりやすくなります。

type Props = {
  isLoading: boolean;
  errorMessage?: string;
  userName?: string;
};

export const UserProfile = ({ isLoading, errorMessage, userName }: Props) => {
  if (isLoading) {
    return <p>読み込んでいます。</p>;
  }

  if (errorMessage) {
    return <p role="alert">{errorMessage}</p>;
  }

  if (!userName) {
    return <p>利用者が見つかりません。</p>;
  }

  return <p>こんにちは、{userName}さん。</p>;
};

上から順番に条件を確認し、該当した時点で以降の処理を行いません。

三項演算子で2つから選ぶ

const LoginStatus = ({ loggedIn }: { loggedIn: boolean }) => {
  return <p>{loggedIn ? 'ログイン中' : 'ログアウト中'}</p>;
};

条件 ? 条件がtrueの場合 : falseの場合の順に書きます。

三項演算子を何重にもすると読みにくくなるため、条件が多い場合はif文を使用します。

&&で条件を満たす場合だけ表示する

const Notice = ({ hasNewMessage }: { hasNewMessage: boolean }) => {
  return (
    <div>
      {hasNewMessage && <p>新しいメッセージがあります。</p>}
    </div>
  );
};

左側がtrueの場合だけ、右側の要素を表示します。

数値を&&の左側へ直接書かない

意図しない0が表示される例
{items.length && <p>{items.length}件あります。</p>}

配列が空の場合、式の結果である0が画面に表示されることがあります。比較結果をbooleanにします。

{items.length > 0 && <p>{items.length}件あります。</p>}

読み込み中、エラー、データなし、正常表示の順に整理すると、表示漏れを見つけやすくなります。

単純な2択には三項演算子、一部だけの表示には&&、複数の状態にはif文を使うと読みやすくなります。


関連記事

  • TypeScript i18nextの動的な翻訳キーを抽出対象に含める

    i18nextでステータスに応じた文言を表示する場合、翻訳キーを動的に切り替えることがあります。ただし、実行時に正しく表示できることと、翻訳キーの抽出ツールが使用箇所を検出できることは別です。今回は、...


  • React useStateで入力フォームを作成する

    Reactでテキストボックスに入力した値を使用するには、useStateで値を保持します。今回は名前とメールアドレスを入力し、送信ボタンを押すと入力内容を表示するフォームを作成します。この例では入力値...


  • React useStateで一覧の追加と削除を行う

    Reactで一覧を表示するときは、配列をuseStateへ保存できます。今回は簡単な買い物リストを作り、項目の追加と削除を行います。配列のpushやspliceで既存のstateを直接変更するのではな...


  • React useRefで入力欄にフォーカスを当てる

    入力フォームを開いた直後や、入力エラーが出たときに、特定の入力欄へフォーカスしたいことがあります。DOMの要素自体を参照するにはuseRefを使います。currentは初回描画中などにnullになり得...


  • React useMemoで重い計算結果を再利用する

    一覧の絞り込みや並べ替えを描画のたびに行うと、データ量や計算内容によっては画面操作が遅くなります。useMemoは、依存する値が変わらない間、以前の計算結果を再利用します。productsまたはque...


  • React useEffectで無限ループが発生するときに確認すること

    ReactのuseEffectを利用したときに無限ループが発生してしまうことがあります。特に注意したいのが、ESLintのreact-hooks/exhaustive-depsで表示された警告をUpd...


  • React useEffectの後片付けでイベント登録を解除する

    画面の幅が変わったときに表示を更新したい場合、ブラウザのresizeイベントを登録できます。登録したままにすると、コンポーネントが不要になったあとも処理が残るため、useEffectの後片付けを用意し...


  • React 関数コンポーネントにプロパティを設定する

    React+TypeScriptで作成した関数コンポーネントにプロパティを設定する方法を紹介します。以下は送信ボタンのコンポーネントを作成しています。isSubmittingというプロパティを用意して...


  • Reactで兄弟コンポーネントの状態を共有する

    検索欄に入力した文字列を、別の一覧コンポーネントでも使いたい場合があります。兄弟同士で別々にstateを持つと値がずれるため、共通の親にstateを置きます。入力欄は値を受け取り、変更を親へ通知します...


  • React useStateでselectの選択値を取得する

    Reactでプルダウンの選択値を扱うには、selectのvalueとonChangeを使用します。DOMから取得するvalueは、数値の選択肢を表示していても文字列です。選択値をそのまま識別子として扱...