Introducción a React — Fundamentos para usarlo con Inertia × Laravel
Guía de introducción para usar React con Laravel + Inertia.js. Se explica de forma práctica desde el recorrido histórico desde laravel/ui hasta los starter kits actuales, así como los hooks de Inertia React: useForm, usePage, etc.
React es una biblioteca de JavaScript para construir interfaces de usuario, desarrollada y mantenida por Meta (antes Facebook). Se caracteriza por su descripción declarativa de la UI y una arquitectura basada en componentes, y se utiliza en un amplio rango: desde pequeños widgets hasta SPAs completas.El núcleo de React es el renderizado eficiente a través del DOM virtual. Cuando cambia el estado (state), React refleja en el DOM solo la diferencia, así que no hace falta manipular manualmente el DOM.
En esta página se explica la combinación de React 19 e Inertia v3. Los starter kits de Laravel 13 usan esta configuración por defecto.
Los componentes de React se escriben con la sintaxis JSX (JavaScript XML). Permite escribir una notación parecida a HTML directamente dentro de JavaScript.
// Ejemplo de JSXfunction Greeting({ name }) { return <h1>Hola, {name}</h1>}
En los starter kits se adopta TypeScript (.tsx) como estándar. Con las definiciones de tipo se mejora el autocompletado del IDE y se detectan bugs de forma temprana.
// Ejemplo de TSX (TypeScript)type Props = { name: string}function Greeting({ name }: Props) { return <h1>Hola, {name}</h1>}
Los starter kits de React de Laravel usan TypeScript + TSX como estándar. Todos los ejemplos de esta página también están en TSX.
La relación entre React y Laravel es algo más reciente que la de Vue, pero actualmente tiene un tratamiento igual o superior.En Laravel 6 (2019) el scaffold de autenticación se separó al paquete laravel/ui, y junto con Vue se ofreció también un scaffold para React. Sin embargo, en aquel momento Vue era predominante y la presencia de la versión React era escasa.Con la incorporación del stack Inertia + React en Laravel Breeze (2021) comenzó su adopción real, y con la renovación de los starter kits de Laravel 12 (2025), React pasó a estar en pie de igualdad con Vue (más aún, apareciendo el primero).
El uso central de React en Laravel actualmente es Inertia × React. Inertia permite realizar una arquitectura de “monolito moderno” en la que se pasan datos directamente desde los controladores de Laravel a componentes de React sin diseñar una API.
Si vas a añadirlo a un proyecto existente, instala por separado el lado servidor y el lado cliente.
# Lado servidor (PHP)composer require inertiajs/inertia-laravel# Lado cliente (JavaScript)npm install @inertiajs/react react react-domnpm install --save-dev @vitejs/plugin-react @types/react @types/react-dom typescript
A continuación, añade el plugin de React en vite.config.ts.
import { defineConfig } from 'vite'import laravel from 'laravel-vite-plugin'import react from '@vitejs/plugin-react'export default defineConfig({ plugins: [ laravel({ input: ['resources/css/app.css', 'resources/js/app.tsx'], refresh: true, }), react(), ],})
Arranca la app Inertia en resources/js/app.tsx.
import { createInertiaApp } from '@inertiajs/react'import { createRoot } from 'react-dom/client'import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'createInertiaApp({ resolve: (name) => resolvePageComponent( `./pages/${name}.tsx`, import.meta.glob('./pages/**/*.tsx'), ), setup({ el, App, props }) { createRoot(el).render(<App {...props} />) },})
Para los detalles de la instalación manual (configuración de la plantilla raíz, registro del middleware, etc.), consulta la documentación oficial de Inertia.
React usa JSX. Es un estilo en el que se escribe sintaxis parecida a HTML dentro de JavaScript. Presentamos los patrones mínimos que conviene conocer para leer el código de los starter kits.
React no tiene una directiva equivalente a v-if. Para condicionales simples usa el operador &&, y para if/else, el operador ternario ? :.
{/* Se muestra solo cuando la condición es true */}{isLoggedIn && <p>¡Bienvenido!</p>}{/* if / else */}{isLoggedIn ? <p>¡Bienvenido!</p> : <a href="/login">Iniciar sesión</a>}{/* if / else if / else */}{isLoggedIn ? <p>¡Bienvenido!</p> : role === 'admin' ? <p>Sesión iniciada como administrador</p> : <a href="/login">Iniciar sesión</a>}
Los atributos de evento en JSX se escriben en camelCase, y se les pasa la referencia a una función.
<button onClick={handleClick}>Clic</button>{/* Cancelar el comportamiento por defecto del envío del formulario */}<form onSubmit={(e) => { e.preventDefault(); handleSubmit() }}> ...</form>
// resources/js/pages/posts/index.tsximport { Link } from '@inertiajs/react'type Post = { id: number title: string created_at: string}type Props = { posts: { data: Post[] // paginate(10) devuelve un objeto que incluye también información de paginación // También se pueden usar current_page, last_page, per_page, total, etc. }}export default function PostsIndex({ posts }: Props) { return ( <div> <h1>Lista de publicaciones</h1> {posts.data.map((post) => ( <article key={post.id}> <h2> <Link href={`/posts/${post.id}`}>{post.title}</Link> </h2> <p>{post.created_at}</p> </article> ))} </div> )}
Solo con recibir las props como argumento del componente puedes usar tal cual los datos pasados desde el controlador. No hace falta definir una API REST.
Al usar el componente <Link> que ofrece @inertiajs/react, la navegación entre páginas se hace por XHR y se evita la recarga completa del navegador.
import { Link } from '@inertiajs/react'export default function PostsIndex() { return ( <div> {/* Enlace básico */} <Link href="/posts">Lista de publicaciones</Link> {/* Enlace con método POST (para borrar, etc.) */} <Link href="/posts/1" method="delete" as="button"> Borrar </Link> {/* Preload (precarga al pasar el ratón) */} <Link href="/posts/1" preload> Ver publicación </Link> </div> )}
Se escribe igual que una etiqueta <a> normal, pero por debajo Inertia solo cambia el componente de página, con lo que se logra una sensación de operación como en una SPA.
El componente <Form> que ofrece @inertiajs/react es el estilo recomendado de envío de formularios que se usa en las pantallas de autenticación del starter kit. Se indican action y method como props, y en la función children (render prop) se reciben errors y processing.
El children de <Form> es una función del tipo ({ errors, processing }) => JSX (patrón render prop). El componente Form calcula automáticamente esos valores y te los pasa. En los campos del formulario, en lugar de un handler onChange, se usa el atributo nativo name de HTML, y funciona la recolección estándar de datos de formulario del navegador.
El starter kit gestiona las rutas como objetos usando Wayfinder. store.form() devuelve un objeto que incluye action y method del objeto de ruta, y se aplica al <Form> con spread.
import { Form } from '@inertiajs/react'import { store } from '@/routes/login'export default function Login() { return ( <Form {...store.form()} resetOnSuccess={['password']} className="flex flex-col gap-6" > {({ errors, processing }) => ( <> {/* Contenido del formulario */} </> )} </Form> )}
Los campos indicados en resetOnSuccess se resetean automáticamente al enviar con éxito. Se indican en campos que se quieren dejar vacíos tras el envío, como la contraseña.
Si no usas Wayfinder, pasando directamente la URL con action="/login" funciona igual.
Para el procesamiento de formularios se usa el hook useForm de @inertiajs/react. La gestión del estado del formulario, el envío y la visualización de errores de validación se implementan de forma sencilla.
Los datos comunes a todas las páginas (información del usuario autenticado, mensajes flash, etc.) se definen en el método share() del middleware HandleInertiaRequests.
Como los datos compartidos se incluyen en todas las peticiones, se recomienda limitarlos al mínimo necesario. Si los pasas mediante una evaluación diferida con fn(), solo se evalúan cuando realmente se acceden.
La versión React de los starter kits usa TypeScript por defecto. Combinado con las definiciones de tipo de Inertia, se garantiza la seguridad de tipos de las props.
React saca su potencial al combinarse con Laravel, especialmente en la configuración de “monolito moderno” a través de Inertia. Su compatibilidad con TypeScript también es excelente, y encaja bien con el desarrollo de aplicaciones a gran escala.
Elemento
Rol
Controlador de Laravel
Enrutamiento, obtención de datos y validación
Inertia::render()
Pasa datos del controlador al componente React
Componente de página React
Recibe props y renderiza la UI
useForm
Gestión del estado del formulario, envío y visualización de errores
Componente Link
Navegación entre páginas sin recarga completa
usePage().props
Acceso a los datos compartidos
TypeScript
Seguridad de tipos de props y mejor autocompletado del IDE
Con Inertia × React obtienes una experiencia de desarrollo que combina la sencillez del backend Laravel con el potente ecosistema de React. Si creas el proyecto con el starter kit, puedes empezar a desarrollar de inmediato con las pantallas de autenticación incluidas.
Documentación oficial de Inertia.js
Para todas las funcionalidades de Inertia v3, consulta la documentación oficial.