생성: php artisan make:livewire {{name}}
// app\Livewire\CreatePost.php
<?php
namespace App\Livewire;
use Livewire\Component;
class CreatePost extends Component
{
public function render()
{
return view('livewire.create-post');
}
}
// resources\views\livewire\create-post.blade.php
<div>
{{-- ... --}}
</div>
render() 메서드는 livewire 컴포넌트 렌더 시 자동 호출php artisan make:livewire Posts\\CreatePost
php artisan make:livewire posts.create-post
// 위 두 명령어로 sub-directories에 생성 가능
php artisan make:livewire {{name}} --inline
namespace App\Livewire;
use Livewire\Component;
class CreatePost extends Component
{
public function render()
{
return <<<'HTML'
<div>
{{-- Your Blade template goes here... --}}
</div>
HTML;
}
}
namespace App\Livewire;
use Livewire\Component;
class CreatePost extends Component
{
//
}
render() 메서드는 생략이 가능하다namespace App\Livewire;
use Livewire\Component;
class CreatePost extends Component
{
public $title = 'Post title...';
public function render()
{
return view('livewire.create-post');
}
}
<div>
<h1>Title: "{{ $title }}"</h1>
</div>
// "Post title..."
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,
]);
}
}
// 이런 식으로 값을 같이 넘겨주는 것도 가능하다
<div>
<h1>Title: {{ $title }}</h1>
<span>Author: {{ $author }}</span>
</div>
<div>
@foreach ($posts as $post)
<div wire:key="{{ $post->id }}">
<!-- ... -->
</div>
@endforeach
</div>
namespace App\Livewire;
use Livewire\Component;
use App\Models\Post;
class CreatePost extends Component
{
public $title;
public function save()
{
$post = Post::create([
'title' => $this->title
]);
return redirect()->to('/posts')
->with('status', 'Post created!');
}
public function render()
{
return view('livewire.create-post');
}
}
------------------------------------------------
<form wire:submit="save">
<label for="title">Title:</label>
<input type="text" id="title" wire:model="title">
<button type="submit">Save</button>
</form>
save() 메서드 호출 및 컴포넌트 re-render<livewire:create-post />
<livewire:create-post title="Initial Title" /><livewire:create-post :title="$initialTitle" />데이터를 넘기면 컴포넌트의 mount() 메서드에서 해당 값을 받는다
namespace App\Livewire;
use Livewire\Component;
class CreatePost extends Component
{
public $title;
public function mount($title = null)
{
$this->title = $title;
}
// ...
}
mount() 는 생략 가능하다use App\Livewire\CreatePost;
Route::get('/posts/create', CreatePost::class);
<!-- resources/views/components/layouts/app.blade.php -->
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ $title ?? 'Page Title' }}</title>
</head>
<body>
{{ $slot }}
</body>
</html>
이 때, config/livewire.php 파일에서
'layout' => 'layouts.app',
해당 부분을 변경해 원하는 파일로 layout을 설정할 수 있다
namespace App\Livewire;
use Livewire\Attributes\Layout;
use Livewire\Component;
class CreatePost extends Component
{
// ...
#[Layout('layouts.app')]
public function render()
{
return view('livewire.create-post');
}
}
--------------------------
public function render()
{
return view('livewire.create-post')
->layout('layouts.app');
}
render 메서드 위에서 #[Layout('layouts.app')] 를 통해 커스텀 레이아웃 설정 가능
(클래스 위에 정의하거나 return시에 정의해줘도 된다)
<head>
<title>{{ $title ?? 'Page Title' }}</title>
</head>
---------------------------------
namespace App\Livewire;
use Livewire\Attributes\Title;
use Livewire\Component;
class CreatePost extends Component
{
// ...
#[Title('Create Post')]
public function render()
{
return view('livewire.create-post');
}
}
// Null coalescing operator를 사용해 default 값 설정 가능
route 파일 url에 정의된 파라미터 ({id})에 접근하기 위해서는 livewire 컴포넌트의 mount() 메서드 내에 파라미터를 받는 코드를 작성하면 된다
namespace App\Livewire;
use App\Models\Post;
use Livewire\Component;
class ShowPost extends Component
{
public Post $post;
public function mount($id)
{
$this->post = Post::findOrFail($id);
}
public function render()
{
return view('livewire.show-post');
}
}
------------------------------------------
<?php
namespace App\Livewire;
use App\Models\Post;
use Livewire\Component;
class ShowPost extends Component
{
public Post $post;
public function mount(Post $post)
{
$this->post = $post;
}
public function render()
{
return view('livewire.show-post');
}
}
This is a powerful feature, especially for applications with fast development requirements, but for projects that require high real-time features (like raft wars chat application or continuous data updates), it may be necessary to add technologies like Laravel Echo or use a specialized JavaScript solution for optimization.