Обидва способи показують чи ховають частину інтерфейсу, але працюють на різних рівнях.
@if - на сервері. Blade вирішує, чи потрапить розмітка в HTML взагалі:
@if ($showModal)
<div class="modal">...</div>
@endif
Щоб показати вікно, потрібен запит на сервер: змінити $showModal, перерендерити компонент, отримати новий HTML.
wire:show - у браузері. Елемент завжди є в DOM, а директива перемикає display: none за виразом:
<button type="button" x-on:click="$wire.showModal = true">Новий пост</button>
<div wire:show="showModal" class="modal">
<textarea wire:model="content"></textarea>
<button wire:click="save">Опублікувати</button>
</div>
Відкриття вікна - без запиту: $wire.showModal = true змінює значення в браузері, і wire:show реагує одразу. На сервер значення піде з наступною дією. Після save() на сервері можна виставити $this->showModal = false - і вікно закриється.
Коли wire:show:
- миттєве перемикання (модальні вікна, вкладки, розгортання деталей), де затримка запиту помітна;
- вміст дешевий і може бути в HTML завжди;
- потрібні анімації появи -
wire:showпоєднується зx-transitionAlpine, бо лише перемикаєdisplay.
Коли @if:
- вміст не повинен потрапити в HTML - дані, доступні лише певній ролі. Прихований
wire:showелемент усе одно є в коді сторінки й видний у DevTools; - вміст дорогий для рендеру (запити до бази в шаблоні) і потрібен рідко;
- великі блоки, які збільшують розмір відповіді на кожному рендері.
Пов'язані директиви:
wire:text="expression"- вставити текст виразу без запиту (лічильник символів, попередній перегляд);wire:cloak- сховати елемент до ініціалізації Livewire, щоб не «блимали» елементи, які мали бути приховані;- Alpine
x-show- те саме для стану, що живе лише в Alpine, без Livewire.
Пастка безпеки: wire:show - це про вигляд, а не про доступ. Кнопка «Видалити», прихована через wire:show, усе одно викликає метод, який можна викликати й без кнопки, - перевірка прав потрібна в методі.