1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JSX入門 — JavaScriptの中にHTMLが書ける仕組みを理解する

1
Posted at

JSX入門 — JavaScriptの中にHTMLが書ける仕組みを理解する

はじめに

Reactのコードを初めて見た時、こんな疑問を持つ人は多いです。

「JavaScriptの中にHTMLが書いてある…これは何?」

function Hello() {
  return <h1>Hello, World!</h1>; // JSの中にHTMLっぽいものがある
}

これが JSX(JavaScript XML)です。この記事ではJSXの仕組みと書き方を整理します。


JSXとは何か

JSXはJavaScriptの拡張構文です。HTMLではありません。

ブラウザはJSXを直接解釈できないため、ビルド時に通常のJavaScriptへ変換されます。

// 書いたコード(JSX)
const element = <h1>Hello</h1>;

// 変換後(JavaScript)
const element = React.createElement('h1', null, 'Hello');

React.createElement() を毎回書くのは大変なので、HTMLに近い記法で書けるようにしたのがJSXです。


HTMLとJSXの違い

見た目は似ていますが、いくつか違いがあります。

1. 属性名がキャメルケース

// HTML
<div class="box" onclick="handleClick()">

// JSX
<div className="box" onClick={handleClick}>

classclassNameonclickonClick など、JavaScriptの予約語と衝突する名前が変わっています。

2. 閉じタグが必須

// HTML(閉じタグ省略可)
<input type="text">
<br>

// JSX(必ず閉じる)
<input type="text" />
<br />

3. 返せる要素は1つだけ

// NG: 複数の要素をそのまま返せない
return (
  <h1>タイトル</h1>
  <p>本文</p>
);

// OK: 1つの要素で囲む
return (
  <div>
    <h1>タイトル</h1>
    <p>本文</p>
  </div>
);

// OK: Fragmentを使うとdivを増やさずに済む
return (
  <>
    <h1>タイトル</h1>
    <p>本文</p>
  </>
);

JSXの中でJavaScriptを使う

{} の中にJavaScriptの式を書けます。

const name = '田中';
const age = 25;

return (
  <div>
    <p>名前: {name}</p>
    <p>年齢: {age}</p>
    <p>来年: {age + 1}</p>
  </div>
);

式は書けるが、文は書けないのがポイントです。

// OK: 式(値を返すもの)
{age >= 20 ? '成人' : '未成年'}
{list.map(item => <li>{item}</li>)}
{'hello'.toUpperCase()}

// NG: 文(if文・for文など)
{if (age >= 20) { return '成人' }} // これは書けない

条件分岐には三項演算子や**&&演算子**を使います。

// 三項演算子
<p>{isLoggedIn ? 'ログイン中' : 'ログアウト'}</p>

// &&演算子(条件を満たす時だけ表示)
<p>{isAdmin && '管理者'}</p>

スタイルの書き方

// インラインスタイルはオブジェクトで渡す
<div style={{ color: 'red', fontSize: '16px' }}>テキスト</div>

// CSSクラスはclassName
<div className="container">テキスト</div>

インラインスタイルのプロパティ名もキャメルケースです(font-sizefontSize)。


コメントの書き方

return (
  <div>
    {/* JSXの中のコメントはこう書く */}
    <p>本文</p>
  </div>
);

///* */ はJSXタグの外側でしか使えません。タグの中では {/* */} を使います。


まとめ

項目 HTMLとの違い
属性名 classclassNameforhtmlFor
イベント onclickonClick(キャメルケース)
閉じタグ 全ての要素に必要(<br />など)
ルート要素 1つだけ返す必要あり(Fragmentで回避可)
JS式の埋め込み {} で囲む
コメント {/* */}

JSXはHTMLに似ていますが、あくまでJavaScriptです。「HTMLっぽく見えるJavaScript」として捉えると、ルールの理由が理解しやすくなります。

次回はコンポーネントとPropsについて整理します。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?