wire:show
Livewire's wire:show
directive makes it easy to show and hide elements based on the result of an expression.
The wire:show
directive is different than using @if
in Blade in that it toggles an element's visibility using CSS (display: none
) rather than removing the element from the DOM entirely. This means the element remains in the page but is hidden, allowing for smoother transitions without requiring a server round-trip.
Basic usage
Here's a practical example of using wire:show
to toggle a "Create Post" modal:
use Livewire\Component;use App\Models\Post; class CreatePost extends Component{ public $showModal = false; public $content = ''; public function save() { Post::create(['content' => $this->content]); $this->reset('content'); $this->showModal = false; }}
<div> <button x-on:click="$wire.showModal = true">New Post</button> <div wire:show="showModal"> <form wire:submit="save"> <textarea wire:model="content"></textarea> <button type="submit">Save Post</button> </form> </div></div>
When the "Create New Post" button is clicked, the modal appears without a server roundtrip. After successfully saving the post, the modal is hidden and the form is reset.
Using transitions
You can combine wire:show
with Alpine.js transitions to create smooth show/hide animations. Since wire:show
only toggles the CSS display
property, Alpine's x-transition
directives work perfectly with it:
<div> <button x-on:click="$wire.showModal = true">New Post</button> <div wire:show="showModal" x-transition.duration.500ms> <form wire:submit="save"> <textarea wire:model="content"></textarea> <button type="submit">Save Post</button> </form> </div></div>
The Alpine.js transition classes above will create a fade and scale effect when the modal shows and hides.