Tutorial para Principiantes: Laravel Breeze + Vue

¡Hola! Te voy a explicar este tutorial como si fuera tu primera vez programando. No te preocupes si no entiendes todo a la primera, ¡es normal! Vamos paso a paso.


📁 Parte 1: ¿Qué es cada cosa?

Imagina que estás construyendo una casa:

  • Laravel = Los cimientos y la estructura (el "esqueleto" de la casa)

  • Vue = La decoración y muebles (lo que ves y tocas)

  • Breeze = Un "kit de inicio" ligero con autenticación básica

  • Vite = El "camión" que lleva los muebles a la casa (compila y actualiza)


📂 La Estructura de Archivos (Dónde está cada cosa)

text
📁 resources/
   📁 js/              ← ¡Aquí trabajamos con VUE (el frente de la casa)!
      📁 Components/   ← Piezas reutilizables (como ladrillos)
      📁 Pages/        ← Las páginas completas (habitaciones enteras)
      📄 app.js        ← El punto de entrada (la puerta principal)
   📁 views/           ← Archivos Blade de Laravel (los cimientos)

🧩 ¿Qué va en cada carpeta?

  • Components/ = Botones, tarjetas, menús pequeños que usas en varias páginas

  • Pages/ = Páginas completas como "Inicio", "Dashboard", "Perfil"

  • views/ = Archivos .blade.php que contienen el HTML base


🎯 Parte 2: El Flujo de Trabajo (Cómo crear algo nuevo)

Paso 1: Piensa qué quieres crear

Ejemplo: Quiero una página que muestre mis tareas pendientes.

Paso 2: Crear el Controlador (El "cerebro")

bash
# Abre tu terminal y escribe:
php artisan make:controller TareaController

Esto crea un archivo en app/Http/Controllers/TareaController.php

Paso 3: Llenar el Controlador con datos

php
// 📁 app/Http/Controllers/TareaController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TareaController extends Controller
{
    public function index()
    {
        // Datos de ejemplo (sin base de datos por ahora)
        $tareas = [
            ['id' => 1, 'titulo' => 'Aprender Vue', 'descripcion' => 'Estudiar los fundamentos', 'completada' => false],
            ['id' => 2, 'titulo' => 'Hacer ejercicio', 'descripcion' => '30 minutos de cardio', 'completada' => true],
            ['id' => 3, 'titulo' => 'Leer libro', 'descripcion' => 'Capítulos 3-5', 'completada' => false],
        ];
        
        // Enviar los datos a la vista
        return view('tareas', compact('tareas'));
    }
}

Paso 4: Crear la Ruta (El "mapa" de la página)

php
// 📁 routes/web.php

use App\Http\Controllers\TareaController;

Route::get('/tareas', [TareaController::class, 'index'])->name('tareas');

Traducción: "Cuando alguien vaya a /tareas, que ejecute el método index del TareaController"

Paso 5: Crear la Vista Blade (El contenedor)

blade
{{-- 📁 resources/views/tareas.blade.php --}}

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Mis Tareas</title>
    @vite('resources/css/app.css')
</head>
<body>
    <div id="app">
        {{-- Aquí va el componente Vue --}}
        <task-list :tareas-iniciales='@json($tareas)'></task-list>
    </div>
    
    @vite('resources/js/app.js')
</body>
</html>

Paso 6: Crear el Componente Vue (Lo que el usuario ve)

Crea un archivo en resources/js/Components/TaskList.vue

vue
<!-- 📁 resources/js/Components/TaskList.vue -->

<template>
    <div class="container mx-auto p-6">
        <h1 class="text-3xl font-bold mb-6">📋 Mis Tareas</h1>
        
        <!-- Grid de 2 columnas -->
        <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
            <!-- Tarjeta de tarea -->
            <div 
                v-for="(tarea, index) in tareas" 
                :key="index"
                class="bg-white rounded-lg shadow-md p-4 hover:shadow-lg transition"
            >
                <div class="flex items-start gap-3">
                    <input 
                        type="checkbox" 
                        v-model="tarea.completada"
                        class="mt-1 w-5 h-5"
                    >
                    
                    <div class="flex-1">
                        <h3 
                            class="font-semibold text-lg"
                            :class="{ 'line-through text-gray-400': tarea.completada }"
                        >
                            {{ tarea.titulo }}
                        </h3>
                        <p class="text-gray-600 text-sm">{{ tarea.descripcion }}</p>
                    </div>
                    
                    <button 
                        @click="eliminarTarea(index)"
                        class="text-red-500 hover:text-red-700"
                    ></button>
                </div>
            </div>
        </div>
        
        <!-- Contador -->
        <div class="mt-6 text-sm text-gray-600">
            ✅ {{ tareasCompletadas }} de {{ tareas.length }} completadas
        </div>
    </div>
</template>

<script>
export default {
    name: 'TaskList',
    props: {
        tareasIniciales: {
            type: Array,
            default: () => []
        }
    },
    data() {
        return {
            tareas: this.tareasIniciales
        }
    },
    computed: {
        tareasCompletadas() {
            return this.tareas.filter(t => t.completada).length;
        }
    },
    methods: {
        eliminarTarea(index) {
            if (confirm('¿Eliminar esta tarea?')) {
                this.tareas.splice(index, 1);
            }
        }
    }
}
</script>

Paso 7: Registrar el Componente en app.js

javascript
// 📁 resources/js/app.js

import './bootstrap';
import { createApp } from 'vue';
import TaskList from './Components/TaskList.vue';

// Crear la app Vue
const app = createApp({});

// Registrar el componente
app.component('task-list', TaskList);

// Montar la app
app.mount('#app');

🔥 Parte 3: ¡Los Comandos Mágicos!

Para Desarrollo (Mientras programas):

bash
# Terminal 1: ¡El servidor de Laravel!
php artisan serve
# → Abre http://localhost:8000 en tu navegador

# Terminal 2: ¡El compilador automático!
npm run dev
# → Esto vigila tus archivos y los actualiza al instante

¿Qué hace npm run dev?

  • Detecta cuando guardas un archivo .vue o .js

  • Lo compila automáticamente

  • Actualiza tu navegador SIN recargar la página (¡magia!)

¿Cuándo usar npm run build?

  • Solo cuando vayas a subir tu página a Internet (producción)

  • Para probar cómo quedará tu página comprimida y rápida

  • Si npm run dev no funciona correctamente


🎨 Parte 4: Componentes Reutilizables (Los Ladrillos)

Crear un Componente Simple

vue
<!-- 📁 resources/js/Components/Boton.vue -->

<template>
    <button 
        @click="handleClick"
        class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600"
    >
        {{ texto }}
    </button>
</template>

<script>
export default {
    name: 'Boton',
    props: {
        texto: {
            type: String,
            default: 'Botón'
        }
    },
    methods: {
        handleClick() {
            this.$emit('click');
        }
    }
}
</script>

Usar el Componente en una Página

vue
<template>
    <div class="p-6">
        <h2>Mi Página</h2>
        <Boton texto="Guardar" @click="guardarDatos" />
    </div>
</template>

<script>
import Boton from '@/Components/Boton.vue';

export default {
    components: {
        Boton
    },
    methods: {
        guardarDatos() {
            alert('¡Datos guardados!');
        }
    }
}
</script>

🎯 Parte 5: El Flujo Completo (Ejemplo Práctico)


Comentarios

Entradas más populares de este blog

Tareas con Laravel + Inertia + Jetstream

HACER CAMBIOS-AL EJEMPLO POR DEFECTO

Laravel + Inertia - ejemplo