Catatan Belajar · · 2 menit baca
Belajar Livewire: Laravel interaktif tanpa JavaScript
Tutorial Livewire 3: instalasi satu perintah, komponen counter pertama, pencarian live dengan wire:model.live, dan validasi tanpa reload — filosofi yang sama dengan HTMX di situs ini.
Livewire membuat halaman Laravel jadi interaktif — tanpa menulis JavaScript dan tanpa membangun API. Komponen PHP-mu dirender ulang di server setiap kali user berinteraksi, mirip filosofi HTMX yang kupakai di situs ini, tapi menyatu penuh dengan Laravel.
1. Instalasi
Prasyarat: project Laravel yang sudah jalan (lihat tutorial Laravel). Lalu:
composer require livewire/livewire
Selesai. Livewire 3 menyuntikkan asset-nya otomatis — tidak perlu menambah @livewireStyles/@livewireScripts manual selama layout-mu punya tag <html> normal.
2. Komponen pertama: counter
php artisan make:livewire counter
Perintah itu membuat dua file:
// app/Livewire/Counter.php
namespace App\Livewire;
use Livewire\Component;
class Counter extends Component
{
public int $count = 0; // public property = state
public function increment() // public method = aksi dari browser
{
$this->count++;
}
public function render()
{
return view('livewire.counter');
}
}
{{-- resources/views/livewire/counter.blade.php --}}
<div>
<h2>{{ $count }}</h2>
<button wire:click="increment">+1</button>
</div>
Pasang di halaman mana pun:
<livewire:counter />
Klik tombolnya: Livewire mengirim request ke server, menjalankan increment(), merender ulang komponen, dan menukar HTML-nya di browser. Kamu tidak menulis satu baris JavaScript pun.
3. Form real-time dengan wire:model
// app/Livewire/CariProduk.php
class CariProduk extends Component
{
public string $kata = '';
public function render()
{
return view('livewire.cari-produk', [
'produk' => Produk::where('nama', 'like', "%{$this->kata}%")->take(10)->get(),
]);
}
}
<div>
<input type="text" wire:model.live.debounce.300ms="kata" placeholder="Cari produk..." />
<ul>
@foreach ($produk as $p)
<li>{{ $p->nama }}</li>
@endforeach
</ul>
</div>
wire:model.live.debounce.300ms = setiap ketikan (dengan jeda 300ms) memicu render ulang — pencarian live tanpa endpoint API, tanpa fetch, tanpa state management.
4. Validasi langsung di komponen
public function simpan()
{
$this->validate([
'nama' => 'required|min:3',
'harga' => 'required|integer|min:0',
]);
Produk::create(['nama' => $this->nama, 'harga' => $this->harga]);
$this->reset();
session()->flash('sukses', 'Produk tersimpan.');
}
@error('nama') <span class="error">{{ $message }}</span> @enderror
Pesan error muncul di bawah input tanpa reload — pola yang sama dengan form kontak HTMX di situs ini, tapi versi Laravel-nya.
Tips dari pengalaman
- Elemen root komponen Livewire harus satu
<div>pembungkus — dua elemen root adalah sumber bug klasik. - Pakai
wire:model.livehanya saat perlu real-time; defaultwire:model(update saat submit) jauh lebih hemat request. - Livewire cocok untuk dashboard admin dan form CRUD; untuk halaman publik yang butuh SEO + kecepatan maksimal, render biasa (Blade murni) tetap lebih ringan.
Mau fitur seperti ini dibangun untuk bisnismu?