Kurnia Andi Nugroho
Livewire, Livewire4, Belajar Livewire4, Tutorial Livewire4
0 comment
Livewire memiliki sistem event yang cukup kuat untuk menghubungkan komponen-komponen yang ada di halaman. Sistem ini sangat menarik karena berbasis browser events. Artinya, event yang kita kirim dari Livewire bisa juga didengar oleh Alpine.js atau JavaScript murni.
Mari kita bahas secara bertahap, mulai dari konsep paling dasar hingga penggunaan lanjutan seperti event dinamis, event antar komponen, hingga integrasi dengan Laravel Echo.
Event di Livewire adalah mekanisme komunikasi antar komponen yang ada di halaman. Misalnya:
Maka, komponen A dapat mengirim event, dan komponen B dapat mendengarkan event tersebut.
Di Livewire, untuk mengirim event kita menggunakan method:
$this->dispatch('nama-event');
Contoh sederhana:
<?php // resources/views/components/post/⚡create.blade.php
use Livewire\Component;
new class extends Component {
public function save()
{
// ... simpan data
$this->dispatch('post-created');
}
};
Artinya: ketika method save() dipanggil, event post-created akan dikirim.
Kadang kita perlu mengirim data, misalnya judul post:
$this->dispatch('post-created', title: $post->title);
Jadi event tidak hanya memberi tahu “ada yang baru”, tapi juga mengirim informasi tambahan.
Di komponen lain, kita bisa mendengarkan event dengan atribut #[On].
Contoh:
<?php // resources/views/components/⚡dashboard.blade.php
use Livewire\Component;
use Livewire\Attributes\On;
new class extends Component {
#[On('post-created')]
public function updatePostList($title)
{
// ... update daftar post
}
};
Penjelasan:
post-created dipicu,updatePostList() akan otomatis dipanggil.$title akan berisi data yang dikirim lewat event.Kadang event perlu “diikat” ke data tertentu, misalnya ID post.
Contoh:
$this->dispatch("post-updated.{$post->id}");
Dan di listener:
#[On('post-updated.{post.id}')]
public function refreshPost()
{
// ...
}
Kalau ID post = 3, maka event yang didengar adalah:
post-updated.3
Ini berguna saat kita ingin event hanya mengenai satu data tertentu.
Livewire memungkinkan parent mendengarkan event dari child langsung di Blade.
Contoh:
<div>
<livewire:edit-post @saved="$refresh">
</div>
Artinya:
edit-post memanggil dispatch('saved')Kalau ingin memanggil method lain, misalnya close():
<livewire:edit-post @saved="close">
Dan jika event mengirim data:
$this->dispatch('saved', postId: 1);
Maka di parent bisa diteruskan:
<livewire:edit-post @saved="close($event.detail.postId)">
Karena Livewire event adalah event browser, maka kita bisa menggunakannya di JavaScript juga.
<script>
this.$on('post-created', () => {
// ...
});
</script>
<script>
this.$dispatch('post-created');
</script>
Jika ingin event hanya untuk komponen itu saja (tidak “bocor” ke komponen lain), gunakan:
this.$dispatchSelf('post-created');
teman-teman juga bisa mendengarkan event Livewire dari script global:
<script>
document.addEventListener('livewire:init', () => {
Livewire.on('post-created', (event) => {
// ...
});
});
</script>
Kalau ingin berhenti mendengarkan:
let cleanup = Livewire.on('post-created', (event) => {});
cleanup(); // un-register listener
Karena event Livewire adalah event browser, Alpine bisa mendengarnya.
<div x-on:post-created="..."></div>
Jika ingin mendengarkan dari seluruh halaman:
<div x-on:post-created.window="..."></div>
Mengambil data tambahan:
<div x-on:post-created="notify('New post: ' + $event.detail.title)"></div>
<button x-on:click="$dispatch('post-created')">...</button>
Dengan data:
<button x-on:click="$dispatch('post-created', { title: 'Post Title' })">...</button>
Jika tujuanmu hanya memanggil method parent dari child, sebenarnya bisa langsung menggunakan $parent.
Contoh:
<button wire:click="$parent.showCreatePostForm()">Create Post</button>
Kadang kita ingin event tidak disebarkan ke semua listener, tapi hanya ke komponen tertentu.
$this->dispatch('post-created')->to(component: Dashboard::class);
Atau hanya ke komponen itu sendiri:
$this->dispatch('post-created')->to(self: true);
teman-teman juga bisa mengirim event langsung dari Blade:
<button wire:click="$dispatch('show-post-modal', { id: {{ $post->id }} })">
Edit Post
</button>
Atau langsung ke komponen tertentu:
<button wire:click="$dispatchTo('posts', 'show-post-modal', { id: {{ $post->id }} })">
Edit Post
</button>
Untuk memastikan event benar-benar dipanggil, Livewire menyediakan assertDispatched().
Contoh:
Livewire::test(CreatePost::class)
->call('save')
->assertDispatched('post-created');
Untuk memastikan listener bekerja:
Livewire::test(Dashboard::class)
->assertSee('Posts created: 0')
->dispatch('post-created')
->assertSee('Posts created: 1');
Jika teman-teman ingin Livewire berfungsi real-time dengan WebSocket, teman-teman bisa menghubungkannya dengan Laravel Echo.
Contoh event Laravel:
class OrderShipped implements ShouldBroadcast
{
public function broadcastOn()
{
return new Channel('orders');
}
}
Di Livewire component, teman-teman bisa mendengarkan event Echo seperti ini:
#[On('echo:orders,OrderShipped')]
public function notifyNewOrder()
{
$this->showNewOrderNotification = true;
}
Kalau channel-nya dinamis (misal ada order id), bisa menggunakan getListeners().
Kadang event broadcast ingin diberi nama khusus:
public function broadcastAs(): string
{
return 'score.submitted';
}
Maka Livewire listener-nya harus pakai dot prefix:
#[On('echo:scores,.score.submitted')]
public function handleScoreSubmitted($event)
{
$this->scores[] = $event['score'];
}
Livewire juga mendukung private dan presence channel (syarat: channel auth sudah di-setup):
"echo-private:orders,OrderShipped" => 'notifyNewOrder',
"echo-presence:orders,joining" => 'notifyNewOrder',
Livewire events itu seperti “penghubung antar komponen” yang sangat fleksibel. teman-teman bisa menggunakannya:
Kurnia Andi Nugroho
Web & Mobile App Developer, Laravel, Inertia, Vue.Js, React.Js
Founder of Lagikoding.com Laravel Enthusiast & Web Developer