Excelente! Ahora veo el problema completo. Estás usando Inertia.js con Vue 3, no una aplicación Vue "estándar". En Inertia, las páginas se resuelven desde ./Pages/ y el layout principal (que incluye la etiqueta <div id="app">) normalmente se define en un layout de Inertia, no en una vista Blade tradicional. Sin embargo, tu vista Blade todavía existe y está intentando montar un componente Vue directamente, pero app.js está configurado para Inertia, no para una app Vue independiente.
El error de "no ver nada" se debe a que app.js monta una aplicación Inertia, pero tu vista Blade no está utilizando el enrutamiento de Inertia; está intentando montar un componente Vue con una prop tareas-iniciales manualmente, pero la aplicación Inertia no conoce ese componente TaskList porque está montando el componente raíz de Inertia (App.vue o el layout).
Solución lógica: dos enfoques
Opción A: Usar Inertia correctamente (recomendado)
En Inertia, las vistas se manejan completamente desde el lado de Vue. Tu vista Blade debe ser reemplazada por un layout de Inertia (normalmente resources/js/Pages/). Pero si quieres mantener la vista Blade, tendrás que configurar Inertia para que renderice una página específica.
Pasos:
Crea un layout base en
resources/js/Layouts/AppLayout.vue(o similar) que incluya el<div id="app">y el contenido principal.Crea una página Inertia para tus tareas, por ejemplo
resources/js/Pages/Tareas/Index.vue, que importe y use el componenteTaskListy reciba las props desde el controlador.En el controlador, en lugar de retornar
view('tareas', compact('tareas')), retornasInertia::render('Tareas/Index', ['tareas' => $tareas]).Elimina la vista Blade
tareas.blade.phpy usa el layout de Inertia.
Ventaja: Todo el flujo está en el ecosistema Inertia, sin mezclar Blade con Vue.
Opción B: Usar Vue standalone junto a Inertia (no recomendado, pero posible)
Si prefieres mantener la vista Blade y usar Vue como un componente aislado, debes modificar app.js para que cree una aplicación Vue "normal" y no la de Inertia. Pero como ya tienes Inertia, esto rompería otras funcionalidades.
Solución más limpia (en el contexto de tu proyecto actual): Sigue la Opción A. Es la forma correcta con Inertia.
¿Cómo implementar la Opción A (lógica con Inertia)?
1. Crea el layout base (si no lo tienes)
En resources/js/Layouts/AppLayout.vue:
<template> <div id="app"> <header> <!-- navegación global --> </header> <main> <slot /> <!-- aquí se renderizará el contenido de la página --> </main> </div> </template> <script> export default { name: 'AppLayout' }; </script>
2. Crea la página de tareas
En resources/js/Pages/Tareas/Index.vue:
<template> <AppLayout> <TaskList :tareas-iniciales="tareas" /> </AppLayout> </template> <script> import AppLayout from '@/Layouts/AppLayout.vue'; import TaskList from '@/Components/TaskList.vue'; export default { components: { AppLayout, TaskList }, props: ['tareas'] }; </script>
3. En el controlador, usa Inertia
use Inertia\Inertia; public function index() { $tareas = Tarea::all(); // o tu lógica return Inertia::render('Tareas/Index', ['tareas' => $tareas]); }
4. Elimina la vista Blade tareas.blade.php y asegura que la ruta apunte al controlador que retorna Inertia::render.
5. Asegura que el app.js ya está configurado para Inertia (como lo tienes). No necesitas cambiar nada en app.js.
¿Qué pasa con @vite('resources/css/app.css')?
Eso debe ir en el layout Blade principal de Inertia (normalmente resources/views/app.blade.php si usas el starter kit de Inertia). Si no lo tienes, créalo:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title inertia>Mis Tareas</title>
@vite('resources/css/app.css')
</head>
<body>
@inertia
@vite('resources/js/app.js')
</body>
</html>Luego configura tu archivo config/inertia.php para que use esa vista como layout raíz (por defecto ya lo hace).
Resumen de la lógica con Inertia
| Elemento | Responsabilidad |
|---|---|
Blade raíz (app.blade.php) | Contiene <div id="app"> (o @inertia que ya lo incluye) y carga los assets. |
| Layout Inertia (AppLayout.vue) | Envuelve todas las páginas, proporciona estructura común. |
| Página Inertia (Tareas/Index.vue) | Recibe props del controlador y renderiza componentes específicos. |
| Componente TaskList | Gestiona la lógica de tareas (CRUD local + comunicación con API). |
Conclusión
Para que veas el componente y funcione la lógica, debes adoptar el flujo de Inertia. La lógica de tu componente TaskList ya está bien (agregar, toggle, eliminar, filtrar). Solo necesitas integrarlo en el sistema de páginas de Inertia.
Si tienes dudas de cómo implementar los métodos con Axios en Inertia (puedes usar axios directamente o Inertia.post para formularios), pero dado que son operaciones asíncronas simples, axios es perfecto.
¿Quieres que detalle los pasos para conectar el backend (rutas API y controladores) para que las operaciones de agregar, actualizar y eliminar persistan en la base de datos?
Comentarios
Publicar un comentario