No entiendo si cuando uso React con Inertia, cada vez que hago click en un botón o enlace si se recarga la página o se redibuja sólo la parte que cambia.
Este planteo toca el corazón de lo que hace a Inertia tan especial.
Cuando utilizas React con Inertia.js y haces clic en un enlace o botón (<Link>
de Inertia) que navega a una nueva página en tu aplicación, no se recarga la página completa. En su lugar, Inertia intercepta la solicitud, recupera los nuevos datos y el componente de React para la página de destino a través de una llamada AJAX, y luego redibuja solo el componente de React que cambia.
¿Cómo funciona?
Primera carga: Cuando entras a tu aplicación por primera vez, tu servidor de Laravel/Rails/etc. renderiza la página completa, incluyendo tu componente raíz de React y los datos iniciales.
Navegaciones siguientes:
Haces clic en un enlace de Inertia (ej.,
<Link href="/dashboard">
).Inertia intercepta este clic y envía una solicitud AJAX a la nueva URL (
/dashboard
).El servidor procesa la solicitud, ejecuta el controlador de Laravel, y en lugar de devolver HTML completo, devuelve una respuesta JSON de Inertia que contiene:
El nombre del componente de React que debe renderizar (ej.,
Dashboard.jsx
).Los props que ese componente necesita (los datos).
Inertia recibe esta respuesta y simplemente le dice a tu aplicación de React: "Toma, aquí tienes el nuevo componente y sus datos, ¡renderízalo!".
React, gracias a su Virtual DOM, solo actualiza las partes de la página que han cambiado. Por lo tanto, no hay un parpadeo ni una recarga completa del navegador.
Lo que significa en la práctica:
Experiencia de usuario fluida: El usuario tiene la sensación de estar en una aplicación de una sola página (SPA), con transiciones rápidas y sin recargas de página.
Estado persistente: El estado de tu aplicación (como la barra de navegación, el reproductor de música, o cualquier otro layout principal) se mantiene porque solo la "página" principal dentro de ese layout cambia.
Simpleza de desarrollo: No tienes que escribir un API por separado para tu frontend. Puedes seguir escribiendo tus rutas y controladores de Laravel/Rails de la forma tradicional, y Inertia se encarga de la comunicación entre el backend y el frontend.
En resumen, la belleza de Inertia es que te da lo mejor de ambos mundos: la experiencia de una SPA con la simplicidad de un desarrollo "monolítico" tradicional. La página solo se redibuja de forma inteligente, no se recarga.
¿Cómo sabe Inertia qué partes de la página pertenecen al estado persistente?
Inertia no sabe por sí mismo qué partes de tu página son persistentes. Eres tú, como desarrollador, quien se lo indica de manera explícita a través de dos mecanismos principales: layouts persistentes y recargas parciales de datos.
1. Layouts Persistentes (Persistent Layouts)
Esta es la forma más común de mantener el estado de componentes estructurales, como una barra de navegación o un pie de página. El concepto es que tienes un componente de React que actúa como el "layout" principal y envuelve todos los demás componentes de página.
Cuando navegas a una nueva página, Inertia solo reemplaza el componente interno de la página, pero el componente de layout exterior permanece montado y su estado se conserva.
¿Cómo lo defines?
Esto se configura en tu archivo resources/js/app.js
al inicializar Inertia. En lugar de simplemente resolver el componente de la página, defines una función que le permite a Inertia saber que debe usar un layout principal.
import { createInertiaApp } from '@inertiajs/react';
import Layout from './Shared/Layout'; // Tu componente de layout
createInertiaApp({
resolve: (name) => {
const pages = import.meta.glob('./Pages/**/*.jsx', { eager: true });
// Importa el componente de la página, pero luego le aplica el layout
let page = pages[`./Pages/${name}.jsx`];
page.default.layout = page.default.layout || ((page) => <Layout children={page} />);
return page;
},
setup({ el, App, props }) {
createRoot(el).render(<App {...props} />);
},
});
En este ejemplo, cuando navegas a /dashboard
, Inertia cargará el componente Dashboard.jsx
y lo pasará como children
al componente Layout.jsx
, que ya está montado. El estado del layout (por ejemplo, si un menú lateral está abierto) se mantendrá sin cambios.
2. Recargas Parciales (Partial Reloads)
Este mecanismo te permite conservar la mayoría de los datos de la página, pero actualizar solo una parte específica de ellos. Es útil cuando quieres actualizar un solo prop sin tener que recargar todos los demás datos.
¿Cómo lo defines?
Para una recarga parcial, debes indicarle a Inertia qué props quieres que se recarguen en tu solicitud. Esto se hace en un enlace o de forma programática.
<!-- En un enlace (por ejemplo, para actualizar un conteo de notificaciones) -->
<Link href="/posts" only={['notifications']}>Ver posts</Link>
```javascript
// O de forma programática con una recarga
import { router } from '@inertiajs/react';
// Solo actualiza los props 'notifications' y 'posts'
router.get('/posts', {
only: ['notifications', 'posts'],
});
En este caso, Inertia envía la solicitud con una cabecera especial (X-Inertia-Partial-Data
) que le dice al backend que solo debe devolver los props solicitados. Inertia luego fusiona esta nueva data con los props ya existentes en el frontend.
En resumen, la clave está en que la persistencia es una decisión de diseño de tu parte. Usas layouts para mantener la estructura y su estado, y recargas parciales para actualizar selectivamente los datos dentro de esa estructura.
¿Inertia tiene algún mecanismo para manejar que el usuario tipee una url válida a otra parte de la aplicación?
¡Sí, esa es la funcionalidad central de Inertia.js!
La belleza de Inertia es que está diseñado para manejar exactamente eso. Cuando un usuario navega a una URL válida, ya sea haciendo clic en un <Link>
de Inertia o escribiendo una URL en la barra de direcciones y presionando Enter
, el proceso es el siguiente:
Cómo funciona la navegación en Inertia
Interceptación de la navegación: Inertia escucha los eventos de navegación del navegador (por ejemplo, cuando se hace clic en un
<Link>
o se envía un formulario). En lugar de permitir que el navegador realice una recarga completa de la página, Inertia intercepta el evento.Petición asíncrona (AJAX): Inertia hace una petición asíncrona (AJAX o XHR) al servidor a la URL solicitada.
Respuesta del servidor: En lugar de devolver una página HTML completa, el servidor (por ejemplo, una aplicación Laravel o Rails configurada para Inertia) detecta esta petición y responde con un objeto JSON. Este objeto contiene el nombre del componente de la página de destino y los "props" (datos) que ese componente necesita para renderizarse.
Renderizado en el cliente: Inertia recibe la respuesta JSON y, sin recargar la página, utiliza los datos para renderizar el nuevo componente de React (o Vue/Svelte) en el lado del cliente, reemplazando el contenido de la página actual.
¿Cuál es el resultado para el usuario?
Para el usuario, la experiencia es indistinguible de una Aplicación de Una Sola Página (SPA) construida con algo como React Router. La transición es instantánea, sin parpadeos ni recargas completas del navegador. Sin embargo, para el desarrollador, es tan simple como si estuviera construyendo una aplicación tradicional multi-página.
En resumen, Inertia se encarga de todo el trabajo pesado de "simular" una SPA en el lado del cliente, mientras te permite mantener tu lógica de enrutamiento y control de datos en el servidor, que es su principal ventaja. No necesitas ninguna configuración adicional para manejar las URL que el usuario escribe; es la funcionalidad por defecto de Inertia.
Entonces ¿El usuario puede escribir una URL y presionar Enter, y en el cambio de vista estar Inertia manteniendo el Persistent Layout con el estado de los componentes que no cambian?
¡Correcto! Esa es la funcionalidad central de Inertia que la diferencia de un SPA tradicional.
Inercia y "Persistent Layouts"
Inertia llama a este mecanismo "Persistent Layouts" (diseños persistentes). Cuando un usuario navega a una nueva página:
Inertia detecta la solicitud.
Le pide al servidor los datos y el nombre del nuevo componente de página.
El servidor envía solo la información necesaria para ese nuevo componente.
Inertia, en el navegador, reemplaza solo el componente de página, dejando el layout (barra de navegación, barra lateral, pie de página, etc.) intacto.
Esto significa que cualquier estado que tengas en esos componentes de layout, como el estado de un menú desplegable, las notificaciones o la información del usuario en la cabecera, se mantiene sin ser reiniciado.
¿Qué sucede cuando el usuario escribe una URL?
Cuando un usuario escribe una URL en la barra de direcciones, el navegador realiza una recarga de página completa. Sin embargo, tu servidor (que está configurado para Inertia) detectará que la petición proviene de un navegador y no de una solicitud de Inertia. Por lo tanto, el servidor responderá con el HTML completo, incluyendo el layout.
Luego, la aplicación de React (o Vue/Svelte) se inicializa y se "hidrata" en el lado del cliente. A partir de ese momento, cualquier navegación posterior a través de los Link
de Inertia volverá a usar el mecanismo de "Persistent Layouts", sin recargas.
En resumen, Inertia es lo suficientemente inteligente como para saber cuándo debe hacer una recarga completa (primera carga o URL manual) y cuándo debe usar su magia para mantener el layout persistente, ofreciendo la mejor experiencia de una SPA sin la complejidad de un enrutador del lado del cliente.
No hay comentarios:
Publicar un comentario