メインコンテンツまでスキップ

第13章:JSXのルール (2)

— HTMLとちょっと違うところを一気にマスター! —classclassNameforhtmlFor、イベント名はキャメルケースなどなど🌸)


きょうのゴール 🎯

  • HTMLからJSXへの置き換えルールをスラスラ言えるようになる
  • 属性名の違い/大文字小文字の注意を体で覚える
  • すぐ使える変換チート表ハンズオンで定着させる

HTML ↔ JSX ざっくり地図 🗺️


まずは超重要:classfor

✅ これに置き換え!

  • class className
  • for htmlFor<label><input id="..."> をつなぐやつ)
// HTMLの感覚
// <label for="email" class="label">メール</label>

// JSXではこう!
<label htmlFor="email" className="label">メール</label>
<input id="email" type="email" />

DOM属性は基本 camelCase 🐪

HTMLのハイフン表記が、JSXでは大文字小文字になるよ(JSのプロパティに寄せている感じ)。

HTMLJSX(camelCase)
tabindextabIndex<button tabIndex={0} />
maxlengthmaxLength<input maxLength={20} />
readonlyreadOnly<input readOnly />
autofocusautoFocus<input autoFocus />
enctypeencType<form encType="multipart/form-data" />
crossorigincrossOrigin<img crossOrigin="anonymous" />
srcsetsrcSet<img srcSet="a.jpg 1x, a@2x.jpg 2x" />
(SVG)viewBoxviewBox大小文字どおり<svg viewBox="0 0 100 100" />

例外的にそのままでOKなのは data-*aria-*(アクセシビリティ)だよ🌟

<div data-user-id="u123" aria-live="polite">更新あり🛎️</div>

値の書き方:"文字列"{式} 🎀

  • 文字列はダブルクォートで "…"
  • JSの値や変数{ ... }(数値・真偽値・計算結果など)
const size = 24;
const isDisabled = true;

<button className="primary" disabled={isDisabled}>
保存({size}pxアイコンつき)
</button>

{true} は省略できる属性もある(disabled などの真偽属性)。 でも、値が変数や計算なら {...} を使うのが鉄則だよ💪


タグはぜんぶ閉じる自己終了が必要 ✂️

HTMLだと省略しがちな <img><input> なども、JSXでは必ず自己終了スラッシュ / をつけよう。

<img src="/logo.png" alt="ロゴ" />
<input type="text" />
<br />
<hr />

イベント名はonXxx(キャメルケース)⚡

HTMLの onclickonClickonchangeonChange みたいに大文字小文字がポイント!

<button onClick={() => alert("ぽちっ✨")}>押す</button>

<input
onChange={(e) => console.log("値:", e.currentTarget.value)}
placeholder="タイプしてみてね"
/>

ここでの e はイベントオブジェクト(次のModuleで型も学ぶよ!) チェックボックスの onChange切り替わるたびに発火するよ☑️


まとめチート表 🧾💨

  • classclassName
  • forhtmlFor
  • 属性は基本 camelCase(例:tabIndexmaxLengthreadOnlyautoFocusencTypecrossOriginsrcSetviewBox
  • data-*aria-* はそのまま
  • 値は "文字列" または {式}
  • 真偽属性は存在だけで truedisabled など)。動的に変えるなら {isDisabled}
  • タグは必ず閉じる(自己終了を忘れない!)
  • イベントは onClick / onChange / onSubmit などキャメルケース

よくあるつまずき&レスキュー 🚑

  • class 書いちゃった…className に直す
  • for にしてラベルが効かないhtmlFor に直す(id とペアで)
  • maxlength が効かないmaxLength に直す
  • viewbox で表示がおかしい(SVG)viewBox(VとBが大文字!)
  • onclick/onchange が動かないonClick/onChange に直す(Cが大文字!)
  • <img> が赤線<img ... />自己終了

ハンズオン①:HTMLをJSXに変換してみよう ✍️🧪

お題(HTML風)

<!-- HTMLイメージ(貼るだけのイメージです) -->
<label for="email" class="label">Email</label>
<input id="email" type="email" autofocus maxlength="30">
<button onclick="submit()">送信</button>
<img src="/banner.jpg" alt="バナー">

解答(JSX / TypeScript)

<label htmlFor="email" className="label">Email</label>
<input id="email" type="email" autoFocus maxLength={30} />
<button onClick={() => submit()}>送信</button>
<img src="/banner.jpg" alt="バナー" />

さらにTypeScriptっぽくするなら、submit 関数の型を書いておくと安心だよ🍀


ハンズオン②:フォームのペアリングを完成させよう 💌

// src/FormSample.tsx
export default function FormSample() {
return (
<form onSubmit={(e) => { e.preventDefault(); alert("送信!🚀"); }}>
<div>
<label htmlFor="user">ユーザー名</label>
<input id="user" type="text" placeholder="Hanako" />
</div>

<div>
<label htmlFor="agree">利用規約に同意</label>
<input id="agree" type="checkbox" />
</div>

<button type="submit">送信する</button>
</form>
);
}
  • labelinputhtmlForid必ず対応させよう💞
  • チェックボックスは onChange で状態が取れるよ(次章以降で型つきで扱うね)

危険ゾーン:dangerouslySetInnerHTML 🧯

生のHTML文字列を挿入する特別API。基本使わないのが吉(XSSなど危険)。 どうしても必要な時だけ、信頼できるソースに限定してね。

<div dangerouslySetInnerHTML={{ __html: "<strong>太字</strong>" }} />

3分チェック ✅(小テスト)

  1. classfor はJSXでなんと書く?
  2. maxlength のJSX表記は?
  3. data-*aria-* は camelCaseにする?しない?
  4. イベント名 onclick のJSX表記は?
  5. <img><input>JSXでの書き方は?

こたえ

  1. className / htmlFor
  2. maxLength
  3. しない(そのまま data-user-id / aria-label など)
  4. onClick
  5. 自己終了<img ... /> / <input ... />

次の章の予告 🎬

第14章は、{} でJSの値を埋め込むテクニックへ! 変数・関数・三項演算子など、UIとロジックをつなぐ基本を一気に身につけよう💫

今日も最高にナイス〜!🥳💖💻