フレームワークを整える
中級React を整える。
= 「状態が変わると画面が描き直される」仕組みを、コードを書いて確かめる
サンプルコード(クリックでエディタに挿入)
CONSOLE
コードを書いて「実行」を押すと、ここに console 出力とエラーが出ます。
無限ループを書くとタブが固まることがあります。そのときは「■ 停止」を押してください。
React が向いている場面/向かない場面
自分に合うのはどれ? 選び方を見る →仮想DOMでUIを組み立てる、最も採用例と日本語情報が多いライブラリ。
◎ 向いている場面
- ・求人・日本語の学習情報の多さを重視するとき(当サイト内で最も情報が多い)
- ・複数人・長期で保守する大きめのWebアプリ
- ・コンポーネント単位のUIライブラリ(部品集)を多く使いたいとき
- ・モバイルアプリ(React Native)まで技術を揃えたいとき
△ 向かない場面
- ・既存のHTMLページに少しだけ動きを足したいだけのとき(JSXやビルド環境が前提になり大掛かり)
- ・とにかく最速で・学習コストをかけずに動かしたいとき
React は「JSX を JS に変換してから」動く。
ブラウザは JSX をそのまま読めません。このページでは typescript.js の変換機能(JSX 専用のオプション)を使い、React.createElement 呼び出しに変換してから classic script として実行しています。
- ①
useState — 状態を持つ
useState(0)は「現在値」と「更新用の関数」の組を返します。更新関数を呼ぶと、React がコンポーネントを再描画します。 - ②
props — 親から子へ値を渡す
コンポーネントは関数の引数のように
{ name, age }を受け取ります。子は props を書き換えられません(一方向のデータの流れ)。 - ③
key — 一覧の中の「どれ」を教える
配列を
mapで描画するとき、React はkeyを手がかりに「どの要素が変わったか」を判断します。インデックスではなく id のような一意な値を使うのが基本です。 - ④
useEffect — 画面反映のあとに動く
useEffect の中身は、レンダー本体が終わって画面に反映されたあとに実行されます。依存配列(
[count])の値が変わるたび、前回分のクリーンアップ → 今回分の実行、の順で呼ばれます。
React(JSX)と Preact + htm の違い
上の「Preact + htm」タブでは、JSX の変換ステップなしで同じカウンタを書いています。
| 観点 | React(JSX) | Preact + htm |
|---|---|---|
| マークアップの書き方 | <div>{count}</div>(JSX) | html`…`(値はドル記号と波括弧で埋め込む)(タグ付きテンプレート) |
| 実行前の変換 | 必要(JSX → JS。ここでは typescript.js) | 不要(そのままブラウザの JS として動く) |
| 読み込み方 | UMD の <script>(classic script) | ESM の import(module script) |
| ライブラリ本体の大きさ | React + ReactDOM(比較的大きい) | Preact(数KB。React 互換 API) |
このページについて
ライブラリは cdn.jsdelivr.net から読み込みます。
書いたコードと実行結果は端末内で完結し、外部へ送信しません(送信ゼロ)。
プレビューはサンドボックス化した iframe で、このページや端末のデータには触れません。
🌐 「React(JSX)」タブでは React 18.3.1 と ReactDOM 18.3.1(UMD)、
JSX 変換用の typescript.js(/typescript/ と同じ処理系)を、
「Preact + htm」タブでは Preact 10.29.8 と htm 3.1.1 を、
「実行」を押した最初の1回だけ取得します(プログラムを受け取るだけの通信で、書いたコードや実行結果は送られません)。
このツールについて
コンポーネント・props・状態(state)は、説明を読むだけではなかなか腹落ちしません。ここでは実際にコードを書き換えて実行し、画面と console の両方で「何が起きたか」を確認できます。
ブラウザ内 React 18 で useState・props・一覧描画・useEffect の順序を体験。JSX は typescript.js で変換してから実行。JSX 変換なしの Preact + htm 版にも切り替えられます。
主な機能
- 4サンプル(useState のカウンタ・props・一覧描画 map/key・useEffect の実行順序)
- JSX は typescript.js(/typescript/ と同じ処理系)で変換してから実行
- 「Preact + htm」タブで JSX 変換なしの同等コードに切り替え
- console 出力・エラー・停止ボタンつきのサンドボックス iframe
- React/ReactDOM/Preact/htm は cdn.jsdelivr.net から初回のみ・送信ゼロ
よくある質問
Q. 入力した React のコードはサーバーに送られますか?
A. 送られません。JSX の変換(typescript.js)も実行(React/ReactDOM)もブラウザ内で完結します。外へ出る通信は処理系のダウンロード(初回のみ)だけです。
Q. JSX はどうやって実行できるコードになるのですか?
A. /typescript/ と同じ typescript.js の transpileModule で JSX を React.createElement の呼び出しに変換してから実行しています。型検査はしていません。
Q. 「Preact + htm」タブは何が違いますか?
A. JSX の変換なしで、タグ付きテンプレートリテラル(html`...`)だけで同じ画面を書いた版です。Preact は数KB の軽量ライブラリで React と似た API を持っています。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。