React

【React】でよく使う条件分岐の記述方法(&&, ??(Null合体演算子),三項演算子)

Reactでよく使う条件分岐の書き方(&&、??(Null合体演算子)、三項演算子)を、同じmapの例で比較します。JSXでif文が書けない理由、===で比較する理由、&&で0が表示される落とし穴も紹介します。

この記事の目次
  1. 普通のif文で書いた場合
  2. 三項演算子で書いた場合
  3. &&で書いた場合
  4. ??(Null合体演算子)が必要な場合

Reactでよく使う条件分岐の記述方法(&&, ??(Null合体演算子),三項演算子)を紹介します。

JSXの{}の中にはif文を書けないため、Reactでは「表示するかしないか」を&&、「AかBか」を三項演算子? :、「nullやundefinedのときの代わりの値」を??で書き分けます。比較には==ではなく、型まで一致させる===を使うのがReactに限らずJavaScriptの基本です。"1" == 1はtrueになりますが、"1" === 1はfalseになるので、APIから来た文字列と数値を比べるときに意図しない一致を防げます。

普通のif文で書いた場合

配列がabcという文字列の場合は、◎をつけて表示するという条件の場合、
通常のif文では以下のようになります。

  const list = animals
    .filter((animal) => animal.indexOf(filteredVal) !== -1)
    .map((animal) => {
      if(animal === "abc") {
        return <li key={animal}>{animal + "◎"}</li>
      } else {
        return <li key={animal}>{animal}</li>
      }
  });

これを三項演算子で書き換えると以下のようになります。

スポンサーリンク

三項演算子で書いた場合

    // .map((animal) => {
    //   if(animal === "abc") {
    //     return <li key={animal}>{animal + "◎"}</li>
    //   } else {
    //     return <li key={animal}>{animal}</li>
    //   }
    .map((animal) => {
        return <li key={animal}>{animal === "abc" ? `${animal}◎` : animal}</li>

上のようによりスッキリした書き方になります。

&&で書いた場合

    // .map((animal) => {
    //     return <li key={animal}>{animal === "abc" ? `${animal}◎` : animal}</li>
    .map((animal) => {
        return <li key={animal}>{animal === "abc" && "◎"}</li>
  });

&&以下はtrueのときのみ表示されるため、空文字などを記載せずにスッキリ書けます。

1点だけ注意があります。左側が0のとき、{count && <p>...</p>}0がそのまま画面に表示されます。数値で判定する場合は{count > 0 && ...}のように、左側が必ずtrue/falseになる式にします。配列をmapで表示する際の書き方はReactで配列を表示する方法|map・filter・keyと表示されない原因にまとめています。

??(Null合体演算子)が必要な場合

Null合体演算子は、A ?? Bのとき、値がnullかundefinedの場合以外はA、nullかundefinedの場合はBとなります。
たとえば、配列内にnullやundefinedが混ざっていると、indexOfなど文字列のメソッドを呼んだ時点でエラーになります。
そのようなエラーを防ぐために、nullかundefinedのときは空文字に置き換える、という記述がNull合体演算子でできます。

    .map((animal) => {
      {
        const animalStr = animal ?? "";
        return <li key={animalStr}>{animalStr === "abc" && "◎"}</li>;
      }

上のようにすれば、nullやundefinedのときは空文字に置き換えられ、エラーを解消できます。||と違い、0や空文字は「値あり」として残るのが??の特徴です。
NULL合体演算子の詳しい説明は、NULL合体演算子(Nullish coalescing operator) ‘??’の具体例を参照してみてください。

クリックなどのイベントに応じて表示を切り替える場合は、【React】イベントを登録する方法でstateを更新し、ここで紹介した書き方で出し分けます。

スポンサーリンク