Contenido del curso
Configuración base
- 3

Configuración inicial de un foro en Laravel
04:59 min - 4

Personalizar componentes Blade con Tailwind CSS
10:26 min - 5

Primer componente Livewire en Laravel
11:10 min - 6

Categorías dinámicas con Laravel y Blade
06:18 min - 7

Migración y factory para preguntas en Laravel
05:37 min - 8

Cómo listar preguntas con Tailwind y Laravel
07:57 min - 9

Respuestas anidadas y migrate fresh en Laravel
06:26 min
Preguntas
Pregunta
Respuesta
Flujo de trabajo tradicional
Conclusiones
Componente Livewire para mostrar respuestas
Resumen
Crear un componente Livewire para respuestas te permite renderizar listas dinámicas y reactivas dentro de una pregunta, reutilizando la misma estructura para respuestas anidadas. Esta guía te muestra cómo generar el componente, iterarlo dentro de una pregunta y conectarlo con su modelo Eloquent para que cualquier desarrollador Laravel pueda replicarlo.
Cómo genero el componente Livewire de respuesta
El primer paso es crear el componente desde la terminal. Lo trabajamos en singular porque va a representar a una única respuesta, aunque luego lo iteremos varias veces.
bash php artisan make:livewire show-respuesta
Este comando genera dos archivos: la clase PHP del componente y la vista Blade asociada. Con eso ya tienes la base para empezar a inyectar datos dinámicos. [01:00]
¿Por qué se nombra el componente en singular? Porque cada instancia del componente representa una sola respuesta. La iteración ocurre desde fuera, recorriendo la colección con un
foreach.
Cómo itero el componente dentro de la vista de pregunta
Dentro de la vista del componente de pregunta, recorres la colección de respuestas y por cada una imprimes una instancia del componente show-respuesta. Aquí entra en juego la propiedad key, que Livewire necesita para diferenciar elementos en una lista reactiva.
blade @foreach($respuestas as $respuesta) <livewire:show-respuesta :respuesta="$respuesta" :key="'respuesta-'.$respuesta->id" /> @endforeach
El identificador único combina un prefijo de texto y el ID. Esto es importante porque se trata de una lista: el sistema necesita un key único para detectar cambios y actualizar solo lo necesario sin romper la reactividad. [02:30]
Cómo paso las respuestas desde el componente padre
Desde el componente de pregunta envías la colección de respuestas asociadas a esa pregunta. La consulta es directa: traes todas las respuestas que pertenezcan a la pregunta actual y las pasas como dato al render.
php return view('livewire.show-pregunta', [ 'respuestas' => $this->pregunta->respuestas, ]);
Cómo registro la propiedad respuesta en el componente PHP
Para que la vista pueda leer $respuesta, debes declararla como propiedad pública en la clase PHP del componente. Sin este paso, Livewire lanza un error porque no reconoce el dato.
php use App\Models\Respuesta;
class ShowRespuesta extends Component { public Respuesta $respuesta; }
Con la propiedad tipada e importada, el componente acepta el modelo completo y lo inyecta automáticamente. Es la misma configuración que ya conoces de otros componentes Livewire. [04:15]
¿Qué hace la propiedad public en un componente Livewire? Expone el dato a la vista Blade y permite que Livewire lo serialice entre peticiones, manteniendo el estado reactivo del componente.
Cómo defino la relación belongsTo entre Respuesta y User
Al renderizar el avatar y el nombre del autor desde la respuesta, el sistema falla si no existe la relación con el usuario. La solución es declararla en el modelo Respuesta igual que ya está hecha en Pregunta.
php public function user() { return $this->belongsTo(User::class); }
Una respuesta pertenece a un usuario, así que belongsTo es el método correcto. Esta relación física debe registrarse en cada entidad de manera directa, y conviene hacerlo cuando el sistema lo exija para evitar confusiones. [06:00]
Cómo diseño la vista de la respuesta con Tailwind
La vista Blade reutiliza la estructura visual de la pregunta: esquinas redondeadas, gradiente hacia la derecha y soporte para hover. Cambias el H2 por el contenido de la respuesta y ajustas el margen.
Los elementos clave del diseño son:
- Avatar y nombre del usuario que escribió la respuesta.
- Texto de la respuesta con
text-white,font-semiboldy margen superiormt-2. - Bloque inferior con dos enlaces, responder y editar, en
text-xsy opacidadtext-white/60. - Contenedor flex con
gap-2yjustify-endpara alinear las acciones a la derecha. - Transición a blanco al hacer hover sobre cada enlace.
blade
<div class="mt-4 text-white/60 text-xs flex gap-2 justify-end"> <a href="#" class="hover:text-white">Responder</a> <a href="#" class="hover:text-white">Editar</a> </div>De momento, responder y editar son enlaces visuales sin lógica. Lo importante en esta etapa es que el usuario pueda crear una respuesta y verla impresa correctamente debajo de su pregunta. [08:20]
Por qué este flujo asegura reactividad y reutilización
La configuración funciona porque cada pieza cumple un rol claro: el componente padre consulta las respuestas, el componente hijo recibe una sola y la renderiza, y el key único permite a Livewire actualizar la lista sin recargar todo el bloque.
Cuando escribes una respuesta nueva como ABC y presionas enter, aparece inmediatamente en el listado gracias a esa reactividad. Más adelante, este mismo componente show-respuesta servirá como base para construir respuestas anidadas, sin tener que duplicar lógica ni vista.
¿Ya replicaste este componente en tu proyecto? Comparte en los comentarios qué errores encontraste al definir la relación belongsTo o al asignar el key de Livewire.