sábado, 9 de agosto de 2025

La navegación con React e Inertia

 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?

  1. 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.

  2. 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.

JavaScript
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.

HTML
<!-- 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.


No hay comentarios: