Saltearse al contenido

Solución de Problemas

Aquí, en Livewire HQ, intentamos eliminar los problemas de su camino antes de que se produzcan. Sin embargo, a veces, hay algunos problemas que no podemos resolver sin introducir otros nuevos, y otras veces, hay problemas que no podemos anticipar.

Aquí hay algunos errores comunes y escenarios que puede encontrar en sus aplicaciones Livewire.

Component mismatches

Al interactuar con componentes Livewire en su página, puede encontrar comportamientos extraños o mensajes de error como los siguientes:

Ventana de terminal
Error: Component already initialized
Ventana de terminal
Error: Snapshot missing on Livewire component with id: ...

Hay muchas razones por las que puedes encontrarte con estos mensajes, pero la más común es olvidar añadir wire:key a los elementos y componentes dentro de un bucle @foreach.

Añadir wire:key

Cada vez que tengas un bucle en tus plantillas Blade usando algo como @foreach, necesitas añadir wire:key a la etiqueta de apertura del primer elemento dentro del bucle:

@foreach($posts as $post)
<!-- Corrección -->
<div wire:key="{{ $post->id }}">
...
</div>
@endforeach

Esto asegura que Livewire pueda seguir la pista de los diferentes elementos del bucle cuando éste cambia.

Lo mismo se aplica a los componentes de Livewire dentro de un bucle:

@foreach($posts as $post)
<!-- Corrección -->
<livewire:show-post :$post :key="$post->id" />
@endforeach

Sin embargo, aquí hay un escenario complicado que puede que no hayas asumido:

Cuando tiene un componente Livewire profundamente anidado dentro de un bucle @foreach, TODAVÍA necesita añadirle una clave. Por ejemplo:

@foreach($posts as $post)
<div wire:key="{{ $post->id }}">
...
<!-- Corrección -->
<livewire:show-post :$post :key="$post->id" />
...
</div>
@endforeach

Sin la clave en el componente Livewire anidado, Livewire será incapaz de emparejar los componentes en bucle entre peticiones de red.

Prefijando claves

Otra situación complicada con la que se puede encontrar es tener claves duplicadas dentro del mismo componente. Esto a menudo resulta del uso de IDs de modelo como claves, que a veces pueden colisionar.

Aquí tenemos un ejemplo en el que necesitamos añadir un prefijo post- y un prefijo author- para designar cada conjunto de claves como único. De lo contrario, si tienes un modelo $post y $author con el mismo ID, tendrías una colisión de ID:

<div>
@foreach($posts as $post)
<!-- Agrega -->
<div wire:key="post-{{ $post->id }}">...</div>
@endforeach
@foreach($authors as $author)
<!-- Agrega -->
<div wire:key="author-{{ $author->id }}">...</div>
@endforeach
</div>

Múltiples instancias de Alpine

Al instalar Livewire, puede encontrarse con mensajes de error como los siguientes:

Ventana de terminal
Error: Detected multiple instances of Alpine running
Ventana de terminal
Alpine Expression Error: $wire is not defined

Si este es el caso, es probable que tenga dos versiones de Alpine corriendo en la misma página. Livewire incluye su propio paquete de Alpine bajo el capó, por lo que debe eliminar cualquier otra versión de Alpine en las páginas Livewire de su aplicación.

Un escenario común en el que esto sucede es al agregar Livewire a una aplicación existente que ya incluye Alpine. Por ejemplo, si instaló el kit de inicio de Laravel Breeze y luego agregó Livewire más tarde, se encontraría con esto.

La solución para esto es simple: eliminar la instancia extra de Alpine.

Eliminando Alpine de Laravel Breeze

Si estás instalando Livewire dentro de un Laravel Breeze existente (versión Blade + Alpine), necesitas eliminar las siguientes líneas de resources/js/app.js:

// Se deja solo este
import "./bootstrap";
// Comienzo Eliminar
import Alpine from "alpinejs";
window.Alpine = Alpine;
Alpine.start();
// Fin Eliminar

Eliminación de una versión CDN de Alpine

Como Livewire versión 2 e inferiores no incluían Alpine por defecto, es posible que haya incluido un CDN de Alpine como etiqueta de script en la cabecera de su maquetación. En Livewire v3, puede eliminar este CDN por completo, y Livewire le proporcionará Alpine automáticamente:

...
<!-- Eliminar este script -->
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
</head>

Nota: también puede eliminar cualquier plugin adicional de Alpine, ya que Livewire incluye todos los plugins de Alpine excepto @alpinejs/ui.

Falta @alpinejs/ui

La versión de Alpine incluida en Livewire incluye todos los plugins de Alpine EXCEPTO @alpinejs/ui. Si está utilizando componentes headless de Alpine Components, que dependen de este plugin, puede encontrarse con errores como los siguientes:

Ventana de terminal
Uncaught Alpine: no element provided to x-anchor

Para solucionarlo, puede incluir el plugin @alpinejs/ui como CDN en su archivo de diseño de la siguiente manera:

...
<!-- Agregar este script -->
<script defer src="https://unpkg.com/@alpinejs/ui@3.13.7-beta.0/dist/cdn.min.js"></script>
</head>

Nota: asegúrese de incluir la última versión de este plugin, que puede encontrar en la página de documentación de cualquier componente.