Livewire Development
When to Apply
Activate this skill when:
- Creating or modifying Livewire components
- Using wire: directives (model, click, loading, sort, intersect)
- Implementing islands or async actions
- Writing Livewire component tests
Documentation
Use
for detailed Livewire 4 patterns and documentation.
Basic Usage
Creating Components
<code-snippet name="Component Creation Commands" lang="bash">
Single-file component (default in v4)
{{ $assist->artisanCommand('make:livewire create-post') }}
Multi-file component
{{ $assist->artisanCommand('make:livewire create-post --mfc') }}
Class-based component (v3 style)
{{ $assist->artisanCommand('make:livewire create-post --class') }}
With namespace
{{ $assist->artisanCommand('make:livewire Posts/CreatePost') }}
</code-snippet>
Converting Between Formats
Use
php artisan livewire:convert create-post
to convert between single-file, multi-file, and class-based formats.
Component Format Reference
| Format | Flag | Structure |
|---|
| Single-file (SFC) | default | PHP + Blade in one file |
| Multi-file (MFC) | | Separate PHP class, Blade, JS, tests |
| Class-based | | Traditional v3 style class |
| View-based | ⚡ prefix | Blade-only with functional state |
Single-File Component Example
<code-snippet name="Single-File Component Example" lang="php">
<?php
use Livewire\Component;
new class extends Component {
public int $count = 0;
public function increment(): void
{
$this->count++;
}
}
?>
<div>
<button wire:click="increment">Count: @{{ $count }}</button>
</div>
</code-snippet>
Livewire 4 Specifics
Key Changes From Livewire 3
These things changed in Livewire 4, but may not have been updated in this application. Verify this application's setup to ensure you follow existing conventions.
- Use for full-page components; config keys renamed: → , → .
- now ignores child events by default (use for old behavior); renamed to .
- Component tags must be properly closed; now uses View Transitions API (modifiers removed).
- JavaScript: → ; / hooks → /.
New Features
- Component formats: single-file (SFC), multi-file (MFC), view-based components.
- Islands () for isolated updates; async actions (, ) for parallel execution.
- Deferred/bundled loading: , for optimized component loading.
| Feature | Usage | Purpose |
|---|
| Islands | | Isolated update regions |
| Async | or | Non-blocking actions |
| Deferred | attribute | Load after page render |
| Bundled | | Load multiple together |
New Directives
- , , , , are available for use.
- attribute automatically added to elements triggering network requests.
| Directive | Purpose |
|---|
| Drag-and-drop sorting |
| Viewport intersection detection |
| Element references for JS |
| Component without rendering |
| Preserve scroll position |
Best Practices
- Always use in loops
- Use for loading states
- Use for instant updates (default is debounced)
- Validate and authorize in actions (treat like HTTP requests)
Configuration
- defaults to ; new configs: , , , .
Alpine & JavaScript
- uses browser View Transitions API; and magic properties available.
- Non-blocking and parallel updates improve performance.
For interceptors and hooks, see reference/javascript-hooks.md.
Testing
<code-snippet name="Testing Example" lang="php">
Livewire::test(Counter::class)
->assertSet('count', 0)
->call('increment')
->assertSet('count', 1);
</code-snippet>
Verification
- Browser console: Check for JS errors
- Network tab: Verify Livewire requests return 200
- Ensure on all loops
Common Pitfalls
- Missing in loops → unexpected re-rendering
- Expecting real-time → use
- Unclosed component tags → syntax errors in v4
- Using deprecated config keys or JS hooks
- Including Alpine.js separately (already bundled in Livewire 4)