Компоненти на сторінці незалежні й не знають одне про одного. Події - спосіб повідомити інших, що щось сталося, не створюючи прямої залежності.
Відправити подію з PHP:
public function save(): void
{
$post = Post::create($this->form->all());
$this->dispatch('post-created', postId: $post->id);
}
Слухати - атрибут #[On] над методом:
use Livewire\Attributes\On;
new class extends Component {
#[On('post-created')]
public function refreshList(int $postId): void
{
unset($this->posts); // скинути кеш обчислюваної властивості
}
};
Параметри події передаються в метод за назвами.
Кому дістанеться подія:
- за замовчуванням - усім компонентам на сторінці, що слухають цю назву;
- конкретному компоненту -
$this->dispatch('post-created')->to(Dashboard::class); - лише самому собі -
$this->dispatch('post-created')->to(self: true).
Події з шаблону - без власного методу-посередника:
<button wire:click="$dispatch('open-modal', { id: {{ $post->id }} })">Редагувати</button>
<button wire:click="$dispatchTo('posts', 'refresh')">Оновити список</button>
Подія від дочірнього компонента до батька можна слухати прямо на тегу:
<livewire:edit-post :$post @saved="close" />
Як це працює всередині: подія з PHP повертається в браузер разом з відповіддю, а вже там Livewire надсилає запити компонентам-слухачам. Тобто подія - це щонайменше два запити, а не виклик методу на сервері.
Можливо, подія не потрібна:
- дитина хоче викликати метод батька -
wire:click="$parent.remove({{ $id }})"; - дитина має оновлюватися зі зміною даних батька -
#[Reactive]; - обидві частини в одному компоненті - острівці.
Назви подій - у стилі kebab-case з «простором імен» (cart-updated, post-created), щоб не зіткнутися з подіями сторонніх бібліотек.