Kurnia Andi Nugroho
0 comment
Jika sebelumnya kita membahas properties sebagai tempat menyimpan state, maka sekarang kita masuk ke bagian yang tidak kalah penting, yaitu actions.
Secara sederhana, actions adalah method pada komponen Livewire yang dipicu oleh interaksi pengguna—misalnya klik tombol, submit form, atau menekan tombol keyboard tertentu.
Keunggulan utama Livewire di sini adalah pengalaman developer yang sangat nyaman: kita bisa memanggil method PHP langsung dari browser, tanpa perlu menulis AJAX, fetch, atau JavaScript yang bertele-tele.
save()Mari mulai dari contoh paling umum: menyimpan data dari form.
new class extends Component {
public $title = '';
public $content = '';
public function save()
{
Post::create([
'title' => $this->title,
'content' => $this->content,
]);
return redirect()->to('/posts');
}
};
<form wire:submit="save">
<input type="text" wire:model="title">
<textarea wire:model="content"></textarea>
<button type="submit">Save</button>
</form>
Saat tombol Save ditekan, wire:submit akan mencegat submit form dan memanggil method save() di server.
Tanpa AJAX, tanpa controller tambahan—langsung PHP.
Inilah esensi Livewire: interaksi frontend → logic backend, dengan cara yang sangat natural.
Dalam praktik nyata, action sering membutuhkan data tambahan. Livewire memungkinkan kita mengirim parameter langsung dari Blade ke method action.
Contoh klasik: menghapus post.
public function delete($id)
{
$post = Post::findOrFail($id);
$this->authorize('delete', $post);
$post->delete();
}
<button wire:click="delete({{ $post->id }})">Delete</button>
Jika tombol ini diklik, Livewire akan memanggil delete(2) misalnya, dan nilai 2 diterima sebagai $id.
Catatan penting: Parameter action harus diperlakukan seperti input request HTTP. Artinya: tidak boleh dipercaya begitu saja.
Agar lebih rapi dan aman, Livewire mendukung route model binding versi action.
public function delete(Post $post)
{
$this->authorize('delete', $post);
$post->delete();
}
Sekarang, Livewire akan otomatis mengambil model Post berdasarkan ID yang dikirim dari frontend. Kode lebih singkat dan lebih aman.
Action juga mendukung dependency injection Laravel.
public function delete(PostRepository $posts, $postId)
{
$posts->deletePost($postId);
}
Livewire akan menyuntikkan PostRepository dari service container sebelum menerima parameter lainnya. Cocok untuk arsitektur yang lebih rapi dan terstruktur.
Livewire menyediakan banyak event listener berbasis wire::
wire:clickwire:submitwire:keydownwire:keyupwire:mouseenterwire:anythingKarena di balik layar Livewire menggunakan Alpine, semua event browser didukung.
Contoh:
<input wire:keydown.enter="searchPosts">
Artinya, method searchPosts() akan dipanggil saat user menekan Enter.
Livewire menyediakan shortcut modifier untuk kombinasi tombol:
<input wire:keydown.shift.enter="submit">
Beberapa modifier umum:
.enter.shift.ctrl.alt.escape.tab.up, .down, .left, .rightIni sangat membantu untuk UX yang lebih natural.
Livewire juga menyediakan modifier event:
<input wire:keydown.prevent="...">
Beberapa modifier penting:
.prevent → preventDefault.stop → stopPropagation.once → hanya sekali.debounce.300ms.throttle.window.outsideSemua ini berasal dari Alpine dan otomatis tersedia di Livewire.
Livewire bisa menangkap event custom, misalnya dari Trix Editor:
<trix-editor
wire:trix-change="setPostContent($event.target.value)">
</trix-editor>
Namun perlu diingat: event seperti ini bisa memicu request di setiap ketikan.
Solusi yang lebih efisien:
<trix-editor
x-on:trix-change="$wire.content = $event.target.value">
</trix-editor>
Secara default, Livewire menonaktifkan semua input dan tombol submit saat wire:submit sedang diproses. Ini mencegah submit ganda.
Untuk menampilkan indikator loading:
<span wire:loading>Saving...</span>
Atau versi yang lebih fleksibel dengan Tailwind:
<button class="data-loading:opacity-50">Save</button>
<span class="not-data-loading:hidden">Saving...</span>
$refreshJika ingin me-render ulang komponen tanpa memanggil method:
<button wire:click="$refresh">Refresh</button>
Livewire akan melakukan request ulang dan memperbarui tampilan.
Livewire 4 menyediakan wire:confirm:
<button
wire:click="delete"
wire:c>
Delete
</button>
Tanpa JavaScript tambahan, dialog konfirmasi langsung muncul.
Karena Livewire dan Alpine menyatu, kita bisa memanggil action lewat $wire:
<button x-on:click="$wire.save()">Save</button>
Bahkan untuk kasus lanjutan:
<div x-intersect="$wire.incrementViewCount()"></div>
Action yang dipanggil lewat $wire akan mengembalikan Promise.
public function getPostCount()
{
return Post::count();
}
<span x-init="$el.innerHTML = await $wire.getPostCount()"></span>
Untuk action yang dikonsumsi JavaScript, gunakan #[Json] agar lebih optimal.
Livewire 4 memperkenalkan JavaScript actions melalui $js.
Contoh optimistik update bookmark:
Ini membuat aplikasi terasa instan dan responsif.
Livewire menyediakan beberapa action bawaan:
$set → set property$toggle → toggle boolean$refresh → render ulang$dispatch → kirim event$parent → panggil action parent$event → akses event JSContoh:
<button wire:click="$toggle('sortAsc')">Toggle</button>
Jika action tidak memengaruhi tampilan, kita bisa mencegah render ulang.
#[Renderless]
public function incrementViewCount()
{
$this->post->incrementViewCount();
}
Atau secara manual:
$this->skipRender();
Secara default, Livewire menjalankan action secara berurutan. Namun dengan #[Async] atau .async, action bisa berjalan paralel.
<button wire:click.async="logActivity">Track</button>
Cocok untuk:
Jangan gunakan async untuk mengubah state UI Karena bisa menyebabkan race condition.
Beberapa prinsip wajib:
Jika sebuah method tidak dimaksudkan dipanggil dari client, buat protected atau private.
protected function delete($id)
{
// aman
}
Ingat: Semua public method bisa dipanggil dari DevTools.
Actions di Livewire 4 adalah jembatan utama antara interaksi pengguna dan logika aplikasi. Jika dipahami dengan benar, kita bisa membangun aplikasi yang:
Kurnia Andi Nugroho
Web & Mobile App Developer, Laravel, Inertia, Vue.Js, React.Js
Founder of Lagikoding.com Laravel Enthusiast & Web Developer