第5回

JSXの書き方:HTMLとの違いを知ってヒーローセクションを作る

ReactのJSX構文をHTMLと比較しながら解説。className・{}式・自己終了タグ・フラグメントなど、つまずきやすいポイントを実例で学ぶ。

·12分で読める
たける
たける ヒーローセクションを書いてたんですけど、`class="hero"` って書いたらエラーが出て……。
りこ
りこ JSXはHTMLじゃないから。`class` は `className` と書く。
たける
たける なんで変えたんですか……。
りこ
りこ `class` はJavaScriptの予約語(クラス定義で使う)。JSXはJavaScriptの中に書くものだから、衝突を避けるために変えてある。

JSXとは

JSXは「JavaScriptの中にHTMLライクな記法で書ける構文」。Reactコンポーネントの見た目を書くために使う。

見た目はHTMLそっくりだが、JavaScriptとして処理されるので、HTMLとは異なるルールがある。

HTMLとJSXの主な違い

1. classclassName

// ❌ HTML の書き方
<div class="hero">

// ✅ JSX の書き方
<div className="hero">

2. forhtmlFor

// ❌
<label for="email">メールアドレス</label>

// ✅
<label htmlFor="email">メールアドレス</label>

for もJavaScriptの予約語(ループ)なので htmlFor に変わっている。

3. 自己終了タグは必ず / で閉じる

// ❌ HTMLでは省略できるが、JSXではエラー
<img src="/characters/riko.jpg">
<input type="text">
<br>

// ✅
<img src="/characters/riko.jpg" />
<input type="text" />
<br />

4. style は文字列ではなくオブジェクト

// ❌ HTMLの書き方
<div style="background-color: #818cf8; padding: 16px;">

// ✅ JSXではオブジェクト。プロパティ名はキャメルケース
<div style={{ backgroundColor: '#818cf8', padding: '16px' }}>
たける
たける `{{` が2つある……これは何ですか?
りこ
りこ 外側の `{}` は「ここにJavaScriptを書く」という記号。内側の `{}` はJavaScriptのオブジェクトリテラル。つまり「JavaScriptのオブジェクトを渡している」。

{} でJavaScriptを埋め込む

JSXの中の {} の中には、任意のJavaScript式を書ける。

const siteName = '生成AI時代のReact実践入門'
const year = 2025

function Hero() {
  return (
    <div>
      <h1>{siteName}</h1>              {/* 変数を表示 */}
      <p>© {year}</p>                  {/* 式を埋め込む */}
      <p>記事数: {10 + 5}本</p>        {/* 計算も書ける */}
    </div>
  )
}

{} の中に書けるのは(値を返すもの)だけ。if 文や for 文は書けない。

// ❌ 文は書けない
{if (isOpen) { return <Modal /> }}

// ✅ 式(三項演算子)なら書ける
{isOpen ? <Modal /> : null}

必ず1つのルート要素で囲む

JSXは必ず1つのルート要素を返さなければならない。

// ❌ 要素が2つ並んでいるのでエラー
function Hero() {
  return (
    <h1>タイトル</h1>
    <p>説明文</p>
  )
}

// ✅ 1つの要素で囲む
function Hero() {
  return (
    <div>
      <h1>タイトル</h1>
      <p>説明文</p>
    </div>
  )
}
たける
たける でも、divで囲むと余分なHTMLが増えますよね。デザインに影響しないですか?
りこ
りこ そういうときは**フラグメント**を使う。HTMLに何も出力されない、Reactだけの仮の容れ物。

フラグメント:余分なdivを出さない

// ✅ <>...</> はHTMLに出力されない
function Hero() {
  return (
    <>
      <h1>タイトル</h1>
      <p>説明文</p>
    </>
  )
}

<></> で囲むだけ。DOMには何も追加されない。

ヒーローセクションを作る

ここまでの知識でヒーローセクションを作ってみる。

// src/components/Hero.tsx
export const Hero = () => {
  return (
    <section className="hero">
      <div className="hero-inner">
        <p className="hero-label">React実践シリーズ</p>
        <h1 className="hero-title">
          生成AI時代の<br />React実践入門
        </h1>
        <p className="hero-description">
          対話形式で学ぶ、実践的なReactの教科書。
          開発環境の構築からWebサイト公開まで。
        </p>
        <a href="/series/react-basics/00-why-learn-in-ai-era" className="hero-button">
          第1回から読む
        </a>
      </div>
    </section>
  )
}
たける
たける `<br />` も自己終了タグで閉じるんですね。HTMLで `<br>` って書いてたので間違えそう。
りこ
りこ エラーが出るのでわかる。エラーメッセージを読む習慣をつけて。TypeScriptとESLintが教えてくれる。

まとめ

HTMLの書き方 JSXでの書き方
class="..." className="..."
for="..." htmlFor="..."
<img src="..."> <img src="..." />
style="color: red" style={{ color: 'red' }}
  • {} の中にJavaScript式を書ける。文(if/for)は書けない
  • 返すJSXは必ず1つのルート要素。余分なdivを避けたいときは <>...</> フラグメントを使う

次の第6回では、propsを使って「データを受け取るコンポーネント」を作る。特徴紹介の FeatureCard を例に、TypeScriptの型定義と合わせて解説する。