什么是 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)语法编写。可以在 JavaScript 中直接写类似 HTML 的语法。.tsx)。有了类型定义,IDE 的补全会更强,bug 也更容易早发现。
在 Laravel 中的定位
历史
React 与 Laravel 的关系比 Vue 稍晚一些,不过现在已经和 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> 组件是启动套件认证页面使用的表单提交推荐样式。通过 props 指定 action 和 method,通过 children 函数(render prop)接收 errors 和 processing。
基本用法
<Form> 的 children 是 ({ errors, processing }) => JSX 的函数(render prop 模式)。Form 组件会自动算出这些值并传入。表单字段用 HTML 原生的 name 属性,而非 onChange,浏览器标准的表单数据采集也照常工作。
启动套件的模式
启动套件用 Wayfinder 把路由当作对象来管理。store.form() 会返回包含路由对象的 action 和 method 的对象,直接 spread 到 <Form> 上。
resetOnSuccess 中列出的字段会在提交成功后自动重置。密码等提交完希望清空的字段可以放在这里。
不使用 Wayfinder 时,直接传
action="/login" 也可以。useForm hook
表单处理使用 @inertiajs/react 的 useForm hook,可以简洁地实现表单状态管理、提交、校验错误显示。
控制器侧
React 表单组件
useForm 返回对象的主要属性:
校验返回错误时,
useForm 会保留已输入内容并展示错误。
共享数据(Shared Data)
所有页面都需要的公共数据(登录中的用户信息、闪存消息等)可以在HandleInertiaRequests 中间件的 share() 方法中定义。
usePage() hook 访问共享数据。
共享数据会包含在每一次请求中,建议只保留必要的最少数据。使用
fn() 惰性求值时,只有真正访问时才会执行求值。React hook 基础
在 Inertia × React 开发中你必须了解的几个 React 基础 hook。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 的完整功能请参考官方文档。