| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- ---
- 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)
- <div wire:key="item-{{ $item->id }}">
- {{ $item->name }}
- </div>
- @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)
|