livewire-development
Develops reactive Livewire 4 components. Activates when creating, updating, or modifying Livewire components; working with wire:model, wire:click, wire:loading, or any wire: directives; adding real-time updates, loading states, or reactivity; debugging component behavior; writing Livewire tests; or when the user mentions Livewire, component, counter, or reactive UI.
How do I install this agent skill?
npx skills add https://github.com/spatie/freek.dev --skill livewire-developmentIs this agent skill safe to install?
- Gen Agent Trust Hubpass
The skill provides standard documentation and development guidelines for Laravel Livewire 4. It includes command examples and code snippets for component creation and testing, with no malicious patterns or security risks detected.
- Socketpass
No alerts
- Snykpass
Risk: LOW · No issues
- Runlayerwarn
2/2 files flagged
- ZeroLeakspass
Score: 93/100 · 2 sections analyzed
What does this agent skill do?
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 search-docs 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) | --mfc | Separate PHP class, Blade, JS, tests |
| Class-based | --class | 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
Route::livewire()for full-page components; config keys renamed:layout→component_layout,lazy_placeholder→component_placeholder. wire:modelnow ignores child events by default (usewire:model.deepfor old behavior);wire:scrollrenamed towire:navigate:scroll.- Component tags must be properly closed;
wire:transitionnow uses View Transitions API (modifiers removed). - JavaScript:
$wire.$js('name', fn)→$wire.$js.name = fn;commit/requesthooks →interceptMessage()/interceptRequest().
New Features
- Component formats: single-file (SFC), multi-file (MFC), view-based components.
- Islands (
@island) for isolated updates; async actions (wire:click.async,#[Async]) for parallel execution. - Deferred/bundled loading:
defer,lazy.bundlefor optimized component loading.
| Feature | Usage | Purpose |
|---|---|---|
| Islands | @island(name: 'stats') | Isolated update regions |
| Async | wire:click.async or #[Async] | Non-blocking actions |
| Deferred | defer attribute | Load after page render |
| Bundled | lazy.bundle | Load multiple together |
New Directives
wire:sort,wire:intersect,wire:ref,.renderless,.preserve-scrollare available for use.data-loadingattribute automatically added to elements triggering network requests.
| Directive | Purpose |
|---|---|
wire:sort | Drag-and-drop sorting |
wire:intersect | Viewport intersection detection |
wire:ref | Element references for JS |
.renderless | Component without rendering |
.preserve-scroll | Preserve scroll position |
Best Practices
- Always use
wire:keyin loops - Use
wire:loadingfor loading states - Use
wire:model.livefor instant updates (default is debounced) - Validate and authorize in actions (treat like HTTP requests)
Configuration
smart_wire_keysdefaults totrue; new configs:component_locations,component_namespaces,make_command,csp_safe.
Alpine & JavaScript
wire:transitionuses browser View Transitions API;$errorsand$interceptmagic properties available.- Non-blocking
wire:polland parallelwire:model.liveupdates 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
wire:keyon all@foreachloops
Common Pitfalls
- Missing
wire:keyin loops → unexpected re-rendering - Expecting
wire:modelreal-time → usewire:model.live - Unclosed component tags → syntax errors in v4
- Using deprecated config keys or JS hooks
- Including Alpine.js separately (already bundled in Livewire 4)
How can the creator link this skill?
Add the canonical catalog link to the repository README so users can inspect current installs and available audits. The publishing guide covers the complete discovery path.
<a href="https://skillzs.dev/skills/spatie/freek.dev/livewire-development">View livewire-development on skillZs</a>