[Laravel]Livewireで投稿一覧の表示をソートする
はじめに
Livewireを使って非同期で投稿をソートできるように実装していきます。
環境
PHP 8.x
Laravel 10.x
MySQL 8.x
Livewire 3.x
tl;dr
- livewireをインストール
- livewireコンポネントを作成する
- コンポネートを読み込む
- コンポーネントプロパティを定義する
- ソートロジックを定義する
- ソートするボタンを作成する
livewireをインストールする
composer require livewire/livewire
コンポネントを作成する
投稿を表示およびソートするための新しいLivewireコンポーネントを作成します。
➜ php artisan livewire:make ListingList
COMPONENT CREATED 🤙
CLASS: app/Livewire/ListingList.php
VIEW: resources/views/livewire/listing-list.blade.php
app/Livewire/ListingList.php
とresources/views/livewire/listing-list.blade.php
を作成されました。
コンポネントを読み込む
作成したコンポネートを投稿一覧に読み込みます。
// 書き方はどちらでも大丈夫
<livewire:listing-list />
@livewire('listing-list')
コンポーネントのプロパティを定義する
<?php
namespace App\Livewire;
use App\Models\Listing;
use Livewire\Component;
use Livewire\Attributes\Computed;
use Livewire\WithPagination;
class ListingList extends Component
{
// ページネーションを有効する
use WithPagination;
// コンピューテッド・プロパティ
#[Computed()]
public function listings()
{
// listings()メソッドに#[Computed]属性が追加されたため、この値はコンポーネント内の他のメソッドやBladeテンプレート内でアクセスできるようになりました。
return Listing::latest()->with(['user'])->filter(request()->only('search'))->paginate(10);
}
}
Eloquentモデルのアクセッサのように、コンピュート・プロパティは、値にアクセスし、リクエスト中に将来のアクセスのためにキャッシュすることを可能にします。
コンピューテッド・プロパティは、コンポーネントのパブリック・プロパティと組み合わせると特に便利です。
コンピューテッド・プロパティを作成するには、Livewireコンポーネントの任意のメソッドの上に#[Computed]
属性を追加します。属性がメソッドに追加されると、他のプロパティと同様にアクセスできます。
ビューから変数をアクセスする
@foreach ($this->listings as $listing)
<x-listing-card :listing="$listing" />
@endforeach
テンプレート内で
$this
を使用する必要があります。
通常のプロパティとは異なり、コンピューテッド・プロパティはコンポーネントのテンプレート内で直接使用することはできません。代わりに、$this
オブジェクトからアクセスする必要があります。たとえば、posts()
という名前のcomputed
プロパティにアクセスするには、テンプレート内で$this->posts
を使用しなければなりません。
ソートロジックを定義する
<?php
use Livewire\Attributes\Url;
class ListingList extends Component
{
#[Url()]
public $sort = 'desc';
public function sortListing($sort){
$this->sort = ($sort === 'desc' ? 'desc' : 'asc');
}
}
#[Url]
属性を使用して$sort
プロパティを定義します。
#[Url]
属性を使用することで、URLのクエリパラメータをコンポーネント内のプロパティに自動的にバインドできます(?sort=desc
または ?sort=asc
)。
コンポーネント内の$sort
プロパティは、デフォルトで'desc'
と初期化されています。
$sort
プロパティは、リスト内の項目を降順または昇順でソートするための情報を持たせます。
sortListing
メソッドは、引数$sort
を受け取り、その値に応じて$sort
プロパティを更新します。
URLパラメータを介してソートオプションを受け取り、それに基づいて$sort
プロパティを変更し、リストを適切にソートすることができるようになります。
ソートするボタンを作成する
<nav class="-mb-px flex space-x-8">
<button class="{{ $sort === 'desc' ? 'text-indigo-600' : 'text-gray-400'}}"
wire:click="sortListing('desc')">新しい順</button>
<button class="{{ $sort === 'asc' ? 'text-indigo-600' : 'text-gray-400'}}"
wire:click="sortListing('asc')">古い順</button>
</nav>
終わりに
これで非同期で投稿一覧の表示をソートすることができましたー
時間順だけではなくタグでソートをしたり、いいね数など条件を追加すればソートすることも可能です。
Discussion