--- name: livewire-development description: "Use for any task or question involving Livewire. Activate if user mentions Livewire, wire: directives, or Livewire-specific concepts like wire:model, wire:click, invoke this skill. Covers building new components, debugging reactivity issues, real-time form validation, loading states, migrating from Livewire 1 to 2, and performance optimization. Do not use for non-Livewire reactive UI (React, Vue, Alpine-only, Inertia.js) or standard Laravel forms without Livewire." license: MIT metadata: author: laravel --- @php /** @var \Laravel\Boost\Install\GuidelineAssist $assist */ @endphp # Livewire Development ## Documentation Use `search-docs` for detailed Livewire 2 patterns and documentation. ## Basic Usage ### Creating Components Use the `{{ $assist->artisanCommand('make:livewire [Posts\\CreatePost]') }}` Artisan command to create new components. ### Fundamental Concepts - State should live on the server, with the UI reflecting it. - All Livewire requests hit the Laravel backend; they're like regular HTTP requests. Always validate form data and run authorization checks in Livewire actions. ## Livewire 2 Specifics - `wire:model` is live by default (real-time updates without modifier). - Components typically exist in the `App\Http\Livewire` namespace. - Use `emit()`, `emitTo()`, `emitSelf()`, and `dispatchBrowserEvent()` for events. - Alpine is included separately from Livewire. ## Best Practices ### Component Structure - Livewire components require a single root element. - Use `wire:loading` and `wire:dirty` for delightful loading states. ### Using Keys in Loops @boostsnippet("Wire Key in Loops", "blade") @foreach ($items as $item)
{{ $item->name }}
@endforeach @endboostsnippet ### Lifecycle Hooks Prefer lifecycle hooks like `mount()`, `updatedFoo()` for initialization and reactive side effects: @boostsnippet("Lifecycle Hook Examples", "php") public function mount(User $user) { $this->user = $user; } public function updatedSearch() { $this->resetPage(); } @endboostsnippet ## JavaScript Hooks You can listen for `livewire:load` to hook into Livewire initialization: @boostsnippet("Livewire Load Hook Example", "js") document.addEventListener('livewire:load', function () { Livewire.onPageExpired(() => { alert('Your session expired'); }); Livewire.onError(status => console.error(status)); }); @endboostsnippet ## Testing @boostsnippet("Example Livewire Component Test", "php") Livewire::test(Counter::class) ->assertSet('count', 0) ->call('increment') ->assertSet('count', 1) ->assertSee(1) ->assertStatus(200); @endboostsnippet @boostsnippet("Testing Livewire Component Exists on Page", "php") $this->get('/posts/create') ->assertSeeLivewire(CreatePost::class); @endboostsnippet ## Common Pitfalls - Forgetting `wire:key` in loops causes unexpected behavior when items change - Not validating/authorizing in Livewire actions (treat them like HTTP requests) - Forgetting that `wire:model` is live by default in v2 (may cause performance issues)