Laravel + Inertia + Vue 3 – Mostrar una lista de 5 tareas (sin guardar)
Laravel + Inertia + Vue 3 – Mostrar una lista de 5 tareas (sin guardar)
En este tutorial construiremos un ejemplo muy pequeño que solo muestra una lista de 5 tareas (con id y nombre) usando Laravel, Inertia.js y Vue 3. No incluiremos formularios ni guardado, para que entiendas claramente cómo se obtienen y pasan los datos desde el controlador al componente Vue a través de Inertia.
Compararemos paso a paso con el enfoque tradicional (Blade) para que veas las diferencias.
1. Estructura de archivos
routes/web.php → ruta app/Http/Controllers/TareaController.php → controlador resources/js/Pages/Tareas.vue → componente Vue
2. Crear el proyecto (si no lo tienes)
Si ya tienes un proyecto con Inertia + Vue, salta este paso. Si no:
composer create-project laravel/laravel ejemplo-inertia-vue cd ejemplo-inertia-vue composer require inertiajs/inertia-laravel php artisan inertia:middleware npm install @inertiajs/vue3 @vitejs/plugin-vue vue
Configura Vite para Vue. Edita vite.config.js:
import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; import vue from '@vitejs/plugin-vue'; export default defineConfig({ plugins: [ laravel({ input: ['resources/css/app.css', 'resources/js/app.js'], refresh: true, }), vue(), ], });
Crea resources/js/app.js como punto de entrada:
import { createApp, h } from 'vue'; import { createInertiaApp } from '@inertiajs/vue3'; import { resolvePageComponent } from 'laravel-vite-plugin/inertia-helpers'; createInertiaApp({ resolve: (name) => resolvePageComponent(`./Pages/${name}.vue`, import.meta.glob('./Pages/**/*.vue')), setup({ el, App, props, plugin }) { createApp({ render: () => h(App, props) }) .use(plugin) .mount(el); }, });
Actualiza resources/views/app.blade.php para usar el layout de Inertia (asegúrate de que incluya @vite y @inertia).
3. Ruta (web.php)
<?php use App\Http\Controllers\TareaController; use Illuminate\Support\Facades\Route; Route::get('/tareas', [TareaController::class, 'index'])->name('tareas.index');
Solo necesitamos una ruta GET para mostrar la lista.
4. Controlador (TareaController.php)
<?php namespace App\Http\Controllers; use Inertia\Inertia; class TareaController extends Controller { public function index() { // Arreglo fijo de 5 tareas (simulando datos) $tareas = [ ['id' => 1, 'nombre' => 'Aprender Laravel'], ['id' => 2, 'nombre' => 'Estudiar Inertia'], ['id' => 3, 'nombre' => 'Practicar Vue 3'], ['id' => 4, 'nombre' => 'Hacer un ejemplo'], ['id' => 5, 'nombre' => 'Compartir conocimiento'], ]; // Renderizar el componente Vue 'Tareas' y pasarle las tareas como prop return Inertia::render('Tareas', [ 'tareas' => $tareas ]); } }
Explicación:
El método
index()crea un arreglo con 5 tareas (podrían venir de una base de datos).Inertia::render('Tareas', ['tareas' => $tareas])le dice a Inertia que cargue el componenteTareas.vuey le pase la variabletareascomo propiedad (prop).
5. Componente Vue (Tareas.vue)
Crea resources/js/Pages/Tareas.vue:
<template> <div style="max-width: 600px; margin: 40px auto; padding: 20px; font-family: sans-serif;"> <h1>📋 Lista de Tareas</h1> <ul v-if="tareas.length" style="list-style: none; padding: 0;"> <li v-for="tarea in tareas" :key="tarea.id" style="background: #f0f0f0; margin: 5px 0; padding: 10px; border-radius: 4px;" > <strong>ID:</strong> {{ tarea.id }} - <strong>Nombre:</strong> {{ tarea.nombre }} </li> </ul> <p v-else style="color: #888;">No hay tareas.</p> </div> </template> <script setup> defineProps({ tareas: Array }) </script>
Explicación:
El componente recibe
tareascomo prop (gracias a Inertia).Usamos
v-forpara iterar sobre el arreglo y mostrar cada tarea.No hay formulario, ni botones, ni interacción. Solo muestra datos.
6. Flujo de obtención de datos
El usuario visita
/tareas.Laravel enruta la petición al controlador
TareaController@index.El controlador crea el arreglo
$tareasy lo pasa aInertia::render().Inertia serializa los datos y los envía al frontend junto con el nombre del componente.
El frontend (Vue) renderiza el componente
Tareasy le inyecta la proptareas.El usuario ve la lista en pantalla.
No hay recarga de página (es un SPA, aunque la primera carga es completa).
No se usa AJAX manual; Inertia se encarga de la comunicación.
7. Comparativa con el enfoque tradicional (Blade)
Si usáramos Blade sin Inertia, haríamos lo siguiente:
Controlador (igual, pero devolviendo vista)
public function index() { $tareas = [...]; // mismo arreglo return view('tareas.index', compact('tareas')); }
Vista Blade (resources/views/tareas/index.blade.php)
<!DOCTYPE html>
<html>
<head><title>Tareas</title></head>
<body>
<h1>📋 Lista de Tareas</h1>
<ul>
@foreach($tareas as $tarea)
<li>ID: {{ $tarea['id'] }} - Nombre: {{ $tarea['nombre'] }}</li>
@endforeach
</ul>
</body>
</html>Diferencias clave
| Aspecto | Blade (tradicional) | Inertia + Vue |
|---|---|---|
| Renderizado | El servidor genera HTML completo y lo envía. | El servidor envía solo los datos (JSON) y el frontend renderiza el componente. |
| Actualización de datos | Para cambiar la lista (ej. agregar), habría que recargar toda la página. | Inertia permite actualizar solo los datos y re-renderizar el componente sin recarga total (si se implementa guardado). |
| Manejo de estado | El estado vive en el servidor (sesión, BD) y se refleja al recargar. | El estado puede mantenerse en el frontend y sincronizarse con el servidor mediante peticiones. |
| Interactividad | Para acciones dinámicas (ej. filtros), se necesita JavaScript adicional o recargas. | Inertia facilita la interacción sin recargas, usando componentes reactivos (Vue). |
| Curva de aprendizaje | Solo PHP y Blade (más sencillo para empezar). | Requiere conocer Vue y el ecosistema de Inertia, pero aporta mayor dinamismo. |
En este ejemplo solo mostramos datos, por lo que la diferencia no es tan evidente, pero sienta las bases para cuando agregues guardado o edición.
8. ¿Cómo se obtienen los datos en Inertia?
El controlador devuelve un array asociativo con las props que quieras pasar al componente.
Inertia convierte ese array en un objeto JSON y lo envía al cliente junto con el nombre del componente.
El cliente (Vue) recibe esas props y las usa para renderizar.
No necesitas crear una API REST; usas las rutas y controladores normales de Laravel, y Inertia se encarga del “puente”.
9. Prueba el ejemplo
Ejecuta
php artisan serveynpm run dev.Ve a
http://localhost:8000/tareas.Verás la lista de 5 tareas.
¡Listo! Un ejemplo mínimo, sin guardado, que muestra cómo obtener y mostrar datos con Inertia + Vue.
Conclusión
Este ejemplo te muestra la base de Inertia: el controlador entrega datos, el componente los recibe y los pinta. La diferencia con Blade es que aquí tienes un frontend reactivo (Vue) y la comunicación es más eficiente, aunque para solo mostrar datos la complejidad es similar. La verdadera potencia aparece cuando empiezas a agregar interacciones (guardar, editar, eliminar) sin recargar la página, manteniendo la lógica en Laravel
Comentarios
Publicar un comentario