refactor: susun semula struktur folder — Laravel source ke src/
This commit is contained in:
95
vendor/laravel/boost/.ai/livewire/2/skill/livewire-development/SKILL.blade.php
vendored
Normal file
95
vendor/laravel/boost/.ai/livewire/2/skill/livewire-development/SKILL.blade.php
vendored
Normal file
@@ -0,0 +1,95 @@
|
||||
---
|
||||
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)
|
||||
Reference in New Issue
Block a user