跳转到主要内容

什么是 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 的语法。
启动套件默认采用 TypeScript(.tsx)。有了类型定义,IDE 的补全会更强,bug 也更容易早发现。
Laravel 的 React 启动套件默认使用 TypeScript + TSX。本文示例也都用 TSX 编写。

在 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 组件,实现“现代单体”架构。

搭建

通过启动套件(推荐)

新项目最省事的方法就是用启动套件。
在交互式提示中选择 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。
相当于 Vue 的 v-for :key,或 Svelte 的 {#each}

className —— CSS 类名

JSX 会被编译成 JavaScript,class 是保留字。CSS 类要用 className

事件处理 —— 驼峰命名

JSX 的事件属性用驼峰命名,传入函数引用。

页面组件基础

Inertia 的页面组件就是普通的 React 组件。从 Laravel 控制器传来的数据会作为 props 接收。

控制器

React 页面组件

只要作为组件参数接收 props,就可以直接使用控制器传来的数据。无需定义 REST API。
@inertiajs/react 提供的 <Link> 组件,页面跳转会通过 XHR 完成,避免整页重载。
写法和普通 <a> 一样,但幕后 Inertia 只替换页面组件,体验接近 SPA。

Form 组件

@inertiajs/react 提供的 <Form> 组件是启动套件认证页面使用的表单提交推荐样式。通过 props 指定 actionmethod,通过 children 函数(render prop)接收 errorsprocessing

基本用法

<Form> 的 children 是 ({ errors, processing }) => JSX 的函数(render prop 模式)。Form 组件会自动算出这些值并传入。表单字段用 HTML 原生的 name 属性,而非 onChange,浏览器标准的表单数据采集也照常工作。

启动套件的模式

启动套件用 Wayfinder 把路由当作对象来管理。store.form() 会返回包含路由对象的 actionmethod 的对象,直接 spread 到 <Form> 上。
resetOnSuccess 中列出的字段会在提交成功后自动重置。密码等提交完希望清空的字段可以放在这里。
不使用 Wayfinder 时,直接传 action="/login" 也可以。

useForm hook

表单处理使用 @inertiajs/reactuseForm hook,可以简洁地实现表单状态管理、提交、校验错误显示。

控制器侧

React 表单组件

useForm 返回对象的主要属性: 校验返回错误时,useForm 会保留已输入内容并展示错误。

共享数据(Shared Data)

所有页面都需要的公共数据(登录中的用户信息、闪存消息等)可以在 HandleInertiaRequests 中间件的 share() 方法中定义。
React 组件里通过 usePage() hook 访问共享数据。
共享数据会包含在每一次请求中,建议只保留必要的最少数据。使用 fn() 惰性求值时,只有真正访问时才会执行求值。

React hook 基础

在 Inertia × React 开发中你必须了解的几个 React 基础 hook。

useState —— 局部状态管理

useEffect —— 处理副作用

useMemouseCallback —— 性能优化


TypeScript 支持

启动套件的 React 版默认用 TypeScript。结合 Inertia 的类型定义可以保证 props 的类型安全。

全局类型定义

启动套件里在 resources/js/types/index.d.ts 中定义共享数据类型。

在页面组件中使用类型


总结

React 与 Laravel 组合起来,特别是通过 Inertia 采用“现代单体”结构时会展现出强大能力。它与 TypeScript 契合度也很好,适合大规模应用开发。 用 Inertia × React,你能得到 Laravel 后端的简洁与 React 强大生态兼备的开发体验。用启动套件创建项目,连认证页面在内都是现成的,可以马上开始开发。

Inertia.js 官方文档

Inertia v3 的完整功能请参考官方文档。
最后修改于 2026年7月18日