Решение проблем⚓︎
Здесь, в штаб-квартире Livewire, мы стараемся убирать препятствия с вашего пути еще до того, как вы с ними столкнетесь. Однако иногда возникают проблемы, которые мы не можем решить, не создав новых, а в других случаях — проблемы, которые мы просто не можем предвидеть.
Вот некоторые распространённые ошибки и ситуации, с которыми вы можете столкнуться в своих приложениях Livewire.
Несоответствия компонентов⚓︎
При взаимодействии с компонентами Livewire на странице вы можете столкнуться со странным поведением или сообщениями об ошибках, подобными следующим:
Существует множество причин, по которым вы можете увидеть эти сообщения, но самая распространённая — это когда вы забываете добавить wire:key к элементам и компонентам внутри цикла @foreach.
Добавление wire:key⚓︎
Каждый раз, когда в ваших шаблонах Blade есть цикл, например @foreach, вам нужно добавить wire:key к открывающему тегу первого элемента внутри цикла:
Это гарантирует, что Livewire сможет отслеживать различные элементы в цикле при его изменении.
То же самое относится к компонентам Livewire внутри цикла:
Однако есть один хитрый сценарий, о котором вы могли не догадываться:
Когда компонент Livewire глубоко вложен внутрь цикла @foreach, вам ВСЁ РАВНО нужно добавить к нему ключ. Например:
@foreach($posts as $post)
<div wire:key="{{ $post->id }}">
...
<livewire:show-post :$post :wire:key="$post->id" />
...
</div>
@endforeach
Без ключа на вложенном компоненте Livewire фреймворк не сможет сопоставить компоненты цикла между сетевыми запросами.
Префиксы ключей⚓︎
Ещё один хитрый сценарий, с которым вы можете столкнуться, — это наличие дублирующихся ключей в одном и том же компоненте. Это часто происходит из-за использования ID моделей в качестве ключей, которые иногда могут конфликтовать.
Вот пример, где нам нужно добавить префиксы post- и author-, чтобы обозначить каждый набор ключей как уникальный. В противном случае, если у вас есть модели $post и $author с одинаковым ID, произойдет коллизия ID:
<div>
@foreach($posts as $post)
<div wire:key="post-{{ $post->id }}">...</div>
@endforeach
@foreach($authors as $author)
<div wire:key="author-{{ $author->id }}">...</div>
@endforeach
</div>
Несколько экземпляров Alpine⚓︎
При установке Livewire вы можете столкнуться с сообщениями об ошибках следующего вида:
Если это так, скорее всего, на одной странице запущены две версии Alpine. Livewire включает в себя собственный бандл Alpine «под капотом», поэтому вы должны удалить любые другие версии Alpine на страницах Livewire в вашем приложении.
Один из распространенных сценариев, в котором это происходит, — добавление Livewire в существующее приложение, которое уже содержит Alpine. Например, если вы установили стартовый набор Laravel Breeze, а затем добавили Livewire, вы столкнетесь с этой проблемой.
Решение простое: удалите лишний экземпляр Alpine.
Удаление Alpine из Laravel Breeze⚓︎
Если вы устанавливаете Livewire внутри существующего Laravel Breeze (версия Blade + Alpine), вам нужно удалить следующие строки из resources/js/app.js:
Удаление CDN-версии Alpine⚓︎
Поскольку Livewire версии 2 и ниже не включал Alpine по умолчанию, вы могли подключить Alpine через CDN в теге script в заголовке вашего макета. В Livewire v3 вы можете полностью удалить этот CDN, и Livewire автоматически предоставит Alpine за вас:
...
<script defer src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js"></script>
</head>
Примечание: вы также можете удалить любые дополнительные плагины Alpine, так как Livewire включает в себя все плагины Alpine, кроме @alpinejs/ui.
Отсутствие @alpinejs/ui⚓︎
Входящая в состав Livewire версия Alpine включает все плагины Alpine, ЗА ИСКЛЮЧЕНИЕМ @alpinejs/ui. Если вы используете headless-компоненты из Alpine Components, которые полагаются на этот плагин, вы можете столкнуться с ошибками вида:
Чтобы исправить это, вы можете просто подключить плагин @alpinejs/ui через CDN в вашем файле макета следующим образом:
...
<script defer src="https://unpkg.com/@alpinejs/ui@3.13.7-beta.0/dist/cdn.min.js"></script>
</head>
Примечание: обязательно используйте последнюю версию этого плагина, которую можно найти на странице документации любого компонента.