React入門第4回~JSX内でJSのコードを入れてみよう!~

今回は、Reactの重要な機能の1つであるJSXの中でJavaScriptのコードを使用する方法について、OZくんとプロ太先生の会話形式で学んでいきましょう。

プロ太
プロ太

OZくん、今日はJSXの中でJavaScriptのコードを使う方法を学んでいきましょう!

OZ
OZ

はい!でも先生、そもそもJSXって何なんですか?

そうですね。まずはJSXについて簡単に説明します。JSXとは、JavaScriptの中でHTML風の記法を使えるようにした特殊な構文なんです。ReactではこのJSXを使って画面の見た目を作っていくんです。

へぇ〜。じゃあ普通のHTMLみたいに書けるってことですか?

そうです!でも、HTMLよりもパワフルで、その中にJavaScriptのコードを埋め込むことができるんです。実際のコードを見ながら、順番に学んでいきましょう!

1.基本的なJSXの構造

const Greet = () => {
  const greet = "こんにちは!!";
  return (
    <div className="greet">
      <h3>OZくん!{greet}</h3>
    </div>
  );
};

おお!HTMLみたいですけど、中に{greet}って書いてありますね。これは何ですか?

JSXでは、中括弧{}を使うことで、JavaScriptの変数や式を埋め込むことができるんだ。この例では、greetという変数の値である”こんにちは!!”が表示されます。

なるほど!でも、classNameって書いてありますけど、HTMLだとclassじゃないんですか?

JSXはJavaScriptの拡張だから、JavaScriptの予約語とかぶらないように、classの代わりにclassNameを使うんだ。スタイリングはCSS側で.greetというクラスに対して設定されていますよ。

.greet {
  color: green;
  border: 5px dashed green;
}

※画像の背景色は、画像と分かりやすくするために水色にしています

2.配列を表示してみよう

次は、配列を表示する方法を見てみましょう!

const Greet = () => {
  const greet = "こんにちは!!";
  const array = ["項目1", "項目2", "項目3"];
  return (
    <div className="greet">
      <h3>OZくん!{greet}</h3>
      <h3>{array}</h3>
    </div>
  );
};

画面に『項目1項目2項目3』って表示されましたね!でも、これじゃあちょっと、つながっていて見にくいかも…

Reactでは配列を直接表示すると、要素が自動的に連結されて表示されるんです。これは便利な場合もあるんですが、たいていは整形して表示したいですよね。より見やすく表示するには、主に2つの方法があります。

1.join メソッドを使う方法

const Greet = () => {
  const greet = "こんにちは!!";
  const array = ["項目1", "項目2", "項目3"];
  return (
    <div className="greet">
      <h3>OZくん!{greet}</h3>
      <h3>{array.join('、')}</h3>
    </div>
  );
};

join メソッドを使うと、『項目1、項目2、項目3』のように区切り文字を入れて表示できます。

2.map メソッドを使う方法(より一般的)

const Greet = () => {
  const greet = "こんにちは!!";
  const array = ["項目1", "項目2", "項目3"];
  return (
    <div className="greet">
      <h3>OZくん!{greet}</h3>
      <ul>
        {array.map((item, index) => (
          <li key={index}>{item}</li>
        ))}
      </ul>
    </div>
  );
};

map メソッドを使うと、配列の各要素を個別の要素として表示できるんです。これが React での一番一般的な方法ですね。

map を使うと、リストみたいに整形されて表示されるんですね!
でも、key={index} って何ですか?

key は React が配列の要素を管理するために必要な特別な属性なんです。各要素を一意に識別するために使われます。今回は配列のインデックスを使っていますが、実際のアプリケーションでは、できるだけユニークなID(例:データベースのID)を使うことが推奨されています。このあたりは、後ほど勉強していきますよ。

なるほど!分かりました!

  • 単純に文字列として連結したい → そのまま表示
  • 区切り文字が必要 → join メソッド
  • リストとして表示したい、もしくは各要素に個別のスタイルやイベントをつけたい
    → map メソッド

3.関数を使ってみよう

次は、関数を使って動的に文字列を生成してみましょう!

const Greet = () => {
  const greet = "こんにちは!!";
  const array = ["項目1", "項目2", "項目3"];
  const say = (str) => `${str} って言うよ!`;
  return (
    <div className="greet">
      <h3>OZくん!{greet}</h3>
      <h3>{array}</h3>
      <h3>{say("Hello")}</h3>
    </div>
  );
};

関数も{}の中で実行できるんですね!

そうです!{}の中では関数を実行することもできるし、計算式を書くこともできるんです。例えば、{2 + 2}と書けば4が表示されますよ。

4.コメントの書き方

const Greet = () => {
  const greet = "こんにちは!!";
  const array = ["項目1", "項目2", "項目3"];
  const say = (str) => `${str} って言うよ!`;
  return (
    <div className="greet">
      <h3>OZくん!{greet}</h3>
      <h3>{array}</h3>
      <h3>{say("Hello")}</h3>
      <h3>{/*コメントの方法*/}</h3>
    </div>
  );
};

HTMLのコメントとは違うんですね!

JSXの中でコメントを書くときは、{/* */}という形式を使うんです。これはJavaScriptのコメント記法をJSXに合わせた形ですね。

5.JSX要素を変数に格納する

最後に、JSX要素自体を変数に格納する方法を見てみましょう!

const Greet = () => {
  const greet = "こんにちは!!";
  const array = ["項目1", "項目2", "項目3"];
  const say = (str) => `${str} って言うよ!`;
  const jsx = <h3>Hello JSX</h3>;
  return (
    <div className="greet">
      <h3>OZくん!{greet}</h3>
      <h3>{array}</h3>
      <h3>{say("Hello")}</h3>
      <h3>{/*コメントの方法*/}</h3>
      {<h3>Hello JSX</h3>}
      {jsx}
    </div>
  );
};

JSXの要素を変数に入れることもできるんですね!でも、直接書く場合と変数に入れる場合で何が違うんですか?

いい質問ですね!実は、パフォーマンスの面ではほとんど違いはありません。でも、同じJSX要素を複数の場所で使い回したい場合や、条件によって表示するJSX要素を切り替えたい場合には、変数に格納しておくと便利なんだよ。

6.JSXで使える「式」と使えない「文」について

JSXで重要な概念をもう1つ説明するね。JSXの中括弧{}の中では『式』は使えるけど、『文』は使えないんです。

式?文?なんですかそれ?

式と文の違い

式と文の違いを簡単に言うと:

  • 式:値を生み出すもの(変数に代入できるもの)
  • 文:プログラムの手順を書くもの(セミコロンで区切れるもの) です。

むむむ…まだピンときません…

では、具体例を見ていきましょう!

使える「式」の例

const Example = () => {
  const name = "OZくん";
  const age = 16;
  
  return (
    <div>
      {/* OK:文字列の結合(式) */}
      <p>{"こんにちは、" + name + "さん"}</p>

      {/* OK:三項演算子(式) */}
      <p>{age >= 18 ? "成人です" : "未成年です"}</p>

      {/* OK:関数の実行(式) */}
      <p>{getMessage()}</p>

      {/* OK:配列のmap(式) */}
      <ul>
        {["りんご", "バナナ", "オレンジ"].map(fruit => (
          <li>{fruit}</li>
        ))}
      </ul>

      {/* OK:数値計算(式) */}
      <p>答えは{1 + 1}です</p>

      {/* OK:オブジェクトのプロパティアクセス(式) */}
      <p>{user.name}</p>
    </div>
  );
};

へぇ!いろんなことができるんですね!

使えない「文」の例

次は、JSXの中で使えない『文』の例を見てみましょう。

const Example = () => {
  const name = "OZくん";
  
  return (
    <div>
      {/* NG:if文は使えない */}
      {
        if (name === "OZくん") {
          return "こんにちは";
        }
      }

      {/* NG:for文は使えない */}
      {
        for (let i = 0; i < 3; i++) {
          console.log(i);
        }
      }

      {/* NG:変数宣言は使えない */}
      {
        let greeting = "こんにちは";
      }

      {/* NG:switch文は使えない */}
      {
        switch(name) {
          case "OZくん":
            return "こんにちは";
        }
      }
    </div>
  );
};

あれ?でも、if文とか普通によく使いますよね?どうするんですか?

そうだね!その代わりに、次のような方法を使います。

文を式に書き換える方法

const Example = () => {
  const name = "OZくん";
  const fruits = ["りんご", "バナナ", "オレンジ"];
  
  // JSXの外で普通にif文を使う
  let greeting;
  if (name === "OZくん") {
    greeting = "こんにちは";
  } else {
    greeting = "はじめまして";
  }
  
  return (
    <div>
      {/* 三項演算子を使う(if文の代わり) */}
      <p>{name === "OZくん" ? "こんにちは" : "はじめまして"}</p>

      {/* &&演算子を使う(if文の代わり) */}
      <p>{name === "OZくん" && "こんにちはOZくん!"}</p>

      {/* mapを使う(for文の代わり) */}
      <ul>
        {fruits.map(fruit => <li key={fruit}>{fruit}</li>)}
      </ul>

      {/* 関数を使って複雑な処理をまとめる */}
      <p>{getGreeting(name)}</p>
    </div>
  );
};

// 複雑な条件分岐は関数にまとめる
const getGreeting = (name) => {
  if (name === "OZくん") {
    return "こんにちは!";
  } else if (name === "先生") {
    return "おはようございます!";
  } else {
    return "はじめまして!";
  }
};

このように、文を式に書き換えたり、JSXの外で処理したりすることで対応します。

覚えておくとよいポイント

JSXの中で使える式かどうかを判断するコツを教えておきますね!

  1. 変数に代入できるか?
    • できる → 式
    • できない → 文
  2. 具体例:
// 式の例(変数に代入できる)
let a = 1 + 1;
let b = "hello" + "world";
let c = condition ? "YES" : "NO";
let d = getFruit();
let e = [1, 2, 3].map(n => n * 2);

// 文の例(変数に代入できない)
let f = if (condition) { ... }  // NG
let g = for (let i = 0; i < 3; i++) { ... }  // NG
let h = let x = 1;  // NG

なるほど!変数に代入できるかどうかを考えれば、式か文か判断できるんですね!

その通り!最初は慣れないかもしれないけど、これは React での重要な概念だから、しっかり覚えておこう!

はい!JSXの中では式しか使えない…よく分かりました!

まとめ

最後に、今日学んだことをまとめておきます!

今日のポイント

  1. JSXの基本
    • JSXの中では{}を使ってJavaScriptのコードを埋め込める
    • HTMLのような記法だが、classの代わりにclassNameを使うなどの違いがある
  2. JSXで使える表示方法
    • 変数の値を表示できる
    • 配列は自動的に連結されて表示される
      • そのまま表示
      • joinで区切り文字を入れて表示
      • mapを使って整形して表示
    • 関数の実行結果を表示できる
    • JSX要素を変数に格納することもできる
  3. JSXの中でのコメント
    • {/* */}の形式で書く
    • 通常のHTMLコメント<!– –>は使わない
  4. 重要!式と文の違い
    • JSXの{}の中では「式」しか使えない
    • 「式」とは値を返すもの(変数に代入できるもの)
      • 計算式:1 + 1
      • 文字列連結:”hello” + “world”
      • 三項演算子:condition ? “YES” : “NO”
      • 関数実行:getMessage()
      • 配列のmap処理:array.map(…)
    • 「文」は直接使えない(if文、for文、switch文など)
      • 代わりに三項演算子を使う
      • &&演算子を使う
      • 関数として外に書く
      • mapメソッドを使う

このように、JSXを使うことで、JavaScriptの機能を活かしながら、直感的なUIを作ることができます。最初は覚えることが多いかもしれませんが、基本的な概念を理解すれば、徐々に複雑なアプリケーションも作れるようになっていきます。一緒に頑張りましょう(^^)