Table of Content
- Introduction
- Membuat Component
- Setting Properties
- Sharing Data ke View
- Tambahkan wire:key ketika Looping
- Menangkap Value ke Properties
- Calling Action
- Render Component
- Passing Data Into Component
- Using Javascript
Introduction
Komponen bisa dikatakan sebuah blok dimana berfungsi untuk menggabungkan state dan behavior. Hal tersebut membuat bagian UI yg dapat digunakan kembali(Reuseable).
Membuat Component
Cukup mudah bisa gunakan perintah berikut :
php artisan make:livewire CreatePostotomatis akan membuat 2 file :
- App/Livewire/CreatePost.php
- Resources/views/livewire/create-post.blade.php
Setting Properties
Untuk menambahkan properti ke component Livewire, deklarasikan properti publik di kelas komponen Anda. Misalnya, mari kita buat properti $title di komponen CreatePost:
App/Livewire/CreatePost.php
<?php
namespace App\Livewire;
use Livewire\Component;
class CreatePost extends Component{
public $title = 'Post title...';
public function render()
{
return view('livewire.create-post');
}
}Akses property ke view seperti berikut :
resources/views/livewire/create-post.blade.php
<div>
<h1>Title: "{{ $title }}"</h1>
</div>Note : ketika kita deklarasi properti otomatis terbaca di view tanpa harus panggil variable ke dalam view.
Sharing Data ke View
Untuk meneruskan data ke tampilan dalam metode render(), Anda dapat menggunakan metode with() pada instance tampilan. Misalnya, Anda ingin meneruskan nama penulis postingan ke tampilan. Dalam hal ini, penulis postingan adalah pengguna yang saat ini diautentikasi:
<?php
namespace App\Livewire;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
class CreatePost extends Component
{
public $title;
public function render()
{
return view('livewire.create-post')->with([
'author' => Auth::user()->name,
]);
}
}Tambahkan wire:key ketika Looping
Saat melakukan looping data dalam templat Livewire menggunakan @foreach, kita harus menambahkan atribut wire:key.
Tanpa atribut wire:key yang ada dalam loop Blade, Livewire tidak akan dapat mencocokkan elemen lama dengan posisi barunya dengan benar saat loop berubah. Hal ini dapat menyebabkan banyak masalah yang sulit didiagnosis pada aplikasi Anda.
Misalnya, jika Anda melakukan perulangan melalui serangkaian postingan, Anda dapat menyetel atribut wire:key ke ID postingan:
resources/views/livewire/create-post.blade.php
<div>
<h1>{{ $title }}</h1>
@foreach($posts as $post)
<ul wire:key="{{ $post->id }}">
<li>{{ $post->title }}</li>
<li>{{ $post->slug }}</li>
</ul>
@endforeach
</div>Menangkap Value ke Properties
Salah satu fitur Livewire yang paling canggih adalah “binding data”: kemampuan untuk secara otomatis menjaga properti tetap sinkron dengan form di halaman.
Mari kita ikat properti $title dari komponen CreatePost ke input teks menggunakan direktif wire:model:
<form>
<label for="title">Title:</label>
<input type="text" id="title" wire:model="title">
</form>Setiap perubahan yang dilakukan pada input teks akan secara otomatis disinkronkan dengan properti $title di komponen Livewire Anda.
Calling Action
<?php
namespace App\Livewire;
use App\Models\Post;
use Livewire\Component;
class CreatePost extends Component
{
public $title;
public $content;
public function save()
{
$post = Post::create([
'title' => $this->title,
'content' => $this->content,
'slug' => 'ABC'
]);
return redirect()->to('/post/create')
->with('status', 'Post created!');
}
public function render()
{
return view('livewire.create-post');
}
}<div>
<form wire:submit="save">
<label for="title">Title:</label>
<input type="text" class="form-control" id="title" wire:model="title">
<label for="content">Content:</label>
<textarea id="content" class="form-control mt-3" wire:model="content"></textarea>
<button type="submit" class="btn btn-primary mt-3">Save</button>
</form>
</div>Jadi component sudah termasuk view dan backend nya (lebih rapih).
Render Component
Ada dua cara untuk merender komponen Livewire:
- Sertakan itu dalam tampilan Blade yang ada
- Tetapkan langsung ke rute sebagai komponen satu halaman penuh (Sebelumnya sudah dicoba)
Passing Data Into Component
Untuk meneruskan data luar ke komponen Livewire, kita dapat menggunakan atribut pada tag komponen. Ini berguna ketika Anda ingin menginisialisasi komponen dengan data tertentu.
<livewire:create-post title="Initial Title" />
// atau
<livewire:create-post :title="$initialTitle" />Data yang diteruskan ke komponen diterima melalui mount() sebagai parameter metode. Dalam hal ini, untuk menetapkan parameter $title ke properti, Anda akan menulis metode mount() seperti berikut:
<?php
namespace App\Livewire;
use Livewire\Component;
class CreatePost extends Component{
public $title;
public function mount($title = null)
{
$this->title = $title;
}
}Using Javascript
Ada banyak contoh di mana utilitas Livewire dan Alpine bawaan tidak cukup untuk mencapai tujuan Anda di dalam komponen Livewire Anda. Livewire menyediakan @script dan @asset
@script
<script>
setInterval(() => {
$wire.$refresh()
}, 2000)
</script>
@endscriptContoh Loading Asset
<div>
<input type="text" data-picker>
</div>
@assets
<script src="<https://cdn.jsdelivr.net/npm/pikaday/pikaday.js>" defer></script>
<link rel="stylesheet" type="text/css" href="<https://cdn.jsdelivr.net/npm/pikaday/css/pikaday.css>">
@endassets
@script
<script>
new Pikaday({
field: $wire.$el.querySelector('[data-picker]')
});
</script>
@endscriptDate : 20-02-2024