はじめに|なぜJSXの記事を書こうと思ったのか
Reactを学び始めたときに最初にぶつかる壁が「JSXって何?」だと思います。
僕自身も
「なんでHTMLっぽいのにJavaScriptの中で書けるの?」
「結局これはHTMLなの?違うの?」
と混乱しました。
この記事では、Reactを学ぶ上で避けて通れない JSX(JavaScript XML) の基本を、初心者の方でも迷わないように丁寧に解説します。
JSXとは何か?

JSXとは、JavaScriptの中でXML風の構文(HTMLに似た書き方)を使えるようにしたものです。
通常のJavaScriptでは、DOMをこう書きます。
const element = React.createElement('h1', null, 'Hello, world!');
これをJSXで書くと、こんなにスッキリします。
const element = <h1>Hello, world!</h1>;
見た目はHTMLに近いですが、中身はJavaScriptに変換されているという点を忘れないでください。
JSXとHTMLの違い
1. 属性名の違い
class → className
for → htmlFor
HTMLの例
<label for="username">名前</label>
JSXの例
<label htmlFor="username">名前</label>
→ for
は JavaScript の予約語のため htmlFor
を使います。
2. 属性はキャメルケース
HTMLは小文字で書きますが、JSXでは JavaScript の命名規則に合わせてキャメルケースにします。
onclick → onClick
tabindex → tabIndex
HTMLの例
<button onclick="handleClick()">Click</button>
<input tabindex="0" />
JSXの例
<button onClick={handleClick}>Click</button>
<input tabIndex={0} />
3. 値は文字列ではなく {}
で囲む
HTMLの例
<a href="https://example.com">リンク</a>
JSXの例
const url = "https://example.com";
<a href={url}>リンク</a>
4. JavaScript式を直接埋め込める
JSXの例
const isLoggedIn = true;
return (
<div>
{isLoggedIn ? <p>ログイン中</p> : <p>ログインしてください</p>}
</div>
);
5. 必ず閉じタグが必要
HTMLの例
<br>
<img src="logo.png">
JSXの例
<br />
<img src="logo.png" />
6. 属性値は基本的にクォーテーション不要
数値や真偽値を渡す場合、文字列ではなくそのまま書けます。
JSXの例
<input type="text" maxLength={10} disabled={true} />
<input type="text" maxLength={10} disabled />
7. 複数要素は親タグでラップする必要がある
NG例
return (
<h1>Hello</h1>
<p>World</p>
);
OK例(divでラップ)
return (
<div>
<h1>Hello</h1>
<p>World</p>
</div>
);
OK例(Fragmentでラップ)
return (
<>
<h1>Hello</h1>
<p>World</p>
</>
);
8. コメントの書き方が違う
HTMLの例
<!-- これはコメント -->
JSXの例
return (
<div>
{/* これはコメント */}
<p>Hello JSX</p>
</div>
);
9. スタイル指定はオブジェクト
HTMLの例
<p style="color: red; font-size: 20px;">赤文字のテキスト</p>
JSXの例
const style = { color: 'red', fontSize: '20px' };
<p style={style}>赤文字のテキスト</p>
JSXとHTMLの違い一覧表
機能 | HTML | JSX |
---|---|---|
クラス指定 | class | className |
for属性 | for | htmlFor |
属性名 | 小文字 | キャメルケース |
自己終了タグ | <br> | <br /> |
コメント | <!-- --> | {/* */} |
スタイル | style="color:red;" | style={{ color: 'red' }} |
属性値 | 文字列 | {} で式を書ける |
複数要素 | OK | 親要素 or Fragmentでラップ |
JSXを使うメリット
- 可読性が高い:HTMLに近い見た目で直感的に理解できる
- 柔軟性がある:JavaScriptの式を組み込める
- エラーが減る:JSXはコンパイル時にチェックされるのでタイプミスが早く見つかる
JSXのつまずきポイント

初心者(自分含め..)がよく混乱するポイントをまとめてみました!
1. class ではなく className を使う
NG例
<div class="container">Hello</div>
OK例
<div className="container">Hello</div>
2. 属性名はキャメルケース(onClick, tabIndex など)
NG例
<button onclick="handleClick()">Click</button>
<input tabindex="0" />
OK例
<button onClick={handleClick}>Click</button>
<input tabIndex={0} />
3. 複数要素を返すときは必ず親要素でラップする必要がある
NG例
return (
<h1>Hello</h1>
<p>World</p>
);
OK例(divでラップ)
return (
<div>
<h1>Hello</h1>
<p>World</p>
</div>
);
OK例(Fragmentでラップ)
return (
<>
<h1>Hello</h1>
<p>World</p>
</>
);
4. 自己終了タグが必要
NG例
<img src="logo.png">
<br>
OK例
<img src="logo.png" />
<br />
5. JavaScript式を文字列として書いてしまう
NG例
const name = "React";
<p>"{name}"</p>
OK例
const name = "React";
<p>{name}</p>
まとめ|JSXを理解するとReactが一気に書きやすくなる
JSXはReactの基礎ですが、HTMLと似ているからこそ混乱しやすい部分です!
ポイントは、「JSXはHTMLではなく、JavaScriptの拡張構文」 という意識を持つこと。
- 見た目はHTMLっぽい
- 実態はJavaScriptに変換されている
- 書き方はHTMLと少し違う(className, onClick, {} など)
これさえ押さえれば、Reactのコードがぐっと読みやすくなるはずです!
JSXは、Facebook社がReactのために作った構文拡張(シンタックス拡張)になります