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

By spatie · 564 installs

npx skills add spatie/freek.dev --skill livewire-development

Source repository · Upstream listing

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:model now ignores child events by default (use wire:model.deep for old behavior); wire:scroll renamed to wire:navigate:scroll . Component tags must be properly closed; wire:transition now uses View Transitions API (modifiers removed). JavaScript: $wire.$js('name', fn) → $wire.$js.name = fn ; commit / request hooks → 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.bundle for 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 scroll are available for use. data loading attribute 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:key in loops Use wire:loading for loading states Use wire:model.live for instant updates (default is debounced) Validate and authorize in actions (treat like HTTP requests) Configuration smart wire keys defaults to true ; new configs: component locations , component namespaces , make command , csp safe . Alpine & JavaScript wire:transition uses browser View Transitions API; $errors and $intercept magic properties available. Non blocking wire:poll and parallel wire:model.live updates improve performance. For interceptors and hooks, see [reference/javascript hooks.md](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 1. Browser console: Check for JS errors 2. Network tab: Verify Livewire requests return 200 3. Ensure wire:key on all @foreach loops Common Pitfalls Missing wire:key in loops → unexpected re rendering Expecting wire:model real time → use wire: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)