Reactとは
React は Meta(旧 Facebook)が開発・維持するユーザーインターフェース構築のための JavaScript ライブラリです。宣言的な UI 記述と コンポーネントベースのアーキテクチャが特徴で、小規模なウィジェットからフル SPA まで幅広く活用されています。 Reactの核心は仮想 DOM を介した効率的な再レンダリングです。状態(state)が変化すると、React は差分だけを DOM に反映するため、手動で DOM を操作する必要がありません。このページで解説するのは React 19 と Inertia v3 の組み合わせです。Laravel 13 のスターターキットはこの構成をデフォルトで使用します。
JSX と TSX
React コンポーネントは JSX(JavaScript XML)という構文で書きます。HTML に似た記法を JavaScript の中に直接書けます。.tsx)が標準採用されています。型定義により IDE の補完が強化され、バグを早期に発見できます。
Laravel でのポジション
歴史
React と Laravel の関係は Vue よりやや浅めですが、現在では同等以上の扱いになっています。 Laravel 6(2019年) で認証スキャフォールドがlaravel/ui パッケージとして切り離され、Vue と同時に React 版スキャフォールドも提供されました。ただし当時は Vue が主流で React 版の存在感は薄い状況でした。
Laravel Breeze(2021年) に Inertia + React スタックが追加されたことで本格的な採用が始まり、Laravel 12(2025年) のスターターキット刷新で React が Vue と完全に同列(むしろ最初に表示される)扱いになりました。
現在の主流スタイル:Inertia × React
現在の Laravel における React の使い方の中心は Inertia × React です。Inertia は API を設計せずに Laravel のコントローラーから直接 React コンポーネントにデータを渡せる「モダンモノリス」アーキテクチャを実現します。セットアップ
スターターキット経由(推奨)
新規プロジェクトで始める場合はスターターキットを使うのが最も手軽です。inertiajs/inertia-laravel(サーバーサイドアダプター)@inertiajs/react(クライアントアダプター)react+react-dom(React 19 本体)@vitejs/plugin-react(Vite プラグイン)- TypeScript +
@types/react - Tailwind CSS + shadcn/ui コンポーネントライブラリ
HandleInertiaRequestsミドルウェア- ログイン・登録などの認証画面(Inertia + React + TypeScript で実装済み)
手動インストール
既存プロジェクトに追加する場合は、サーバーサイドとクライアントサイドを別々にインストールします。vite.config.ts に React プラグインを追加します。
resources/js/app.tsx で Inertia アプリを起動します。
手動インストールの詳細(ルートテンプレートの設定やミドルウェアの登録など)は Inertia 公式ドキュメント を参照してください。
ディレクトリ構造
スターターキットでは React のページコンポーネントをresources/js/pages/ ディレクトリに配置します。
Inertia::render('posts/index', [...]) と書くと resources/js/pages/posts/index.tsx が対応するコンポーネントになります。
JSX 構文の基礎
React は JSX を使います。JavaScript の中に HTML ライクな構文を書くスタイルで、スターターキットのコードを読むために最低限知っておきたいパターンを紹介します。{} — 変数展開
JSX 内では {} を使って JavaScript の値や式を埋め込みます。
条件分岐 — && と三項演算子
React には v-if に相当するディレクティブがありません。シンプルな条件には && 演算子、if/else には三項演算子 ? : を使います。
リスト描画 — .map()
リストの描画には Array.map() を使います。効率的な差分更新のために key prop は必ず指定します。
v-for :key や Svelte の {#each} に相当します。
className — CSS クラス名
JSX は JavaScript にコンパイルされるため、class は予約語です。CSS クラスには className を使います。
イベントハンドラー — キャメルケース
JSX のイベント属性はキャメルケースで、関数の参照を渡します。ページコンポーネントの基本
Inertia のページコンポーネントは通常の React コンポーネントです。Laravel のコントローラーから渡したデータが props として受け取れます。コントローラー
React ページコンポーネント
Link コンポーネント
@inertiajs/react が提供する <Link> コンポーネントを使うと、ページ遷移が XHR で行われ、ブラウザのフルリロードを回避できます。
<a> タグと同じように書けますが、裏側で Inertia がページコンポーネントだけを差し替えるため SPA のような操作感になります。
Form コンポーネント
@inertiajs/react が提供する <Form> コンポーネントは、スターターキットの認証画面で使われているフォーム送信の推奨スタイルです。action と method を props で指定し、children 関数(render prop)で errors と processing を受け取ります。
基本的な使い方
<Form> の children は ({ errors, processing }) => JSX という関数(render prop パターン)です。Form コンポーネントがこれらの値を自動で算出して渡してくれます。フォームフィールドには onChange ハンドラではなく HTML ネイティブの name 属性を使い、ブラウザの標準フォームデータ収集が機能します。
スターターキットのパターン
スターターキットは Wayfinder を使ってルートをオブジェクトとして管理しています。store.form() はルートオブジェクトの action と method を含むオブジェクトを返し、<Form> に spread します。
resetOnSuccess に指定したフィールドは、送信成功時に自動でリセットされます。パスワードフィールドなど送信後に空にしたいフィールドに指定します。
Wayfinder を使わない場合は
action="/login" のように直接 URL を渡せば同じように動作します。useForm フック
フォーム処理には @inertiajs/react の useForm フックを使います。フォームの状態管理・送信・バリデーションエラー表示がシンプルに実装できます。
コントローラー側
React フォームコンポーネント
useForm が返すオブジェクトの主なプロパティをまとめます。
バリデーションエラーが返ったとき、
useForm は入力内容を保持したままエラーを表示します。
共有データ(Shared Data)
すべてのページで共通して必要なデータ(ログイン中のユーザー情報・フラッシュメッセージなど)はHandleInertiaRequests ミドルウェアの share() メソッドで定義します。
usePage() フックを使います。
共有データはすべてのリクエストに含まれるため、必要最低限のデータに絞ることを推奨します。
fn() を使ったレイジー評価にすると、実際にアクセスされたときだけ評価されます。React フック基礎
Inertia × React で開発するうえで知っておくべき React の基本フックを紹介します。useState — ローカルな状態管理
useEffect — 副作用の処理
useMemo と useCallback — パフォーマンス最適化
TypeScript サポート
スターターキットの React 版は TypeScript がデフォルトです。Inertia の型定義と組み合わせることで、props の型安全を確保できます。グローバル型定義
スターターキットではresources/js/types/index.d.ts に共有データの型を定義します。
ページコンポーネントでの型利用
まとめ
React は Laravel との組み合わせで、特に Inertia を経由した「モダンモノリス」構成で力を発揮します。TypeScript との相性も優れており、大規模なアプリケーション開発に向いています。
Inertia × React を使うと、Laravel バックエンドのシンプルさと React の強力なエコシステムを組み合わせた開発体験が得られます。スターターキットでプロジェクトを作成すれば、認証画面も含めてすぐに開発を始められます。
Inertia.js 公式ドキュメント
Inertia v3 の全機能については公式ドキュメントを参照してください。