Класс WithoutUrlPagination
Класс WithoutUrlPagination используется в компонентах Livewire для отключения автоматического сохранения текущей страницы пагинации в строке URL. По умолчанию трейт WithPagination сохраняет состояние страницы в параметре запроса page, что позволяет пользователям делиться ссылками на конкретные страницы списка. Однако в некоторых случаях такое поведение нежелательно, и тогда применяется класс WithoutUrlPagination.
Класс не имеет собственных методов и используется как маркер. Его применение гарантирует, что при обновлении страницы или переходе по прямой ссылке состояние пагинации не будет восстановлено из URL, а останется в значении по умолчанию (обычно первая страница).
Синтаксис
Для использования класса необходимо подключить трейт WithPagination в компоненте и применить класс WithoutUrlPagination:
<?php
namespace AppLivewire;
use LivewireComponent;
use LivewireWithPagination;
use LivewireWithoutUrlPagination;
class UserList extends Component
{
use WithPagination, WithoutUrlPagination;
public function render()
{
$users = User::paginate(10);
return view('livewire.user-list', ['users' => $users]);
}
}
?>
Пример базового использования
Рассмотрим компонент для отображения списка пользователей. Без класса WithoutUrlPagination текущая страница будет сохраняться в URL:
<?php
namespace AppLivewire;
use LivewireComponent;
use LivewireWithPagination;
use AppModelsUser;
class UserList extends Component
{
use WithPagination;
public function render()
{
$users = User::paginate(10);
return view('livewire.user-list', ['users' => $users]);
}
}
?>
<div>
@foreach ($users as $user)
<div>{{ $user->name }}</div>
@endforeach
{{ $users->links() }}
</div>
При переходе на вторую страницу URL будет выглядеть как /users?page=2. После обновления страницы компонент восстановит состояние и покажет вторую страницу.
Пример с отключением сохранения в URL
Теперь добавим класс WithoutUrlPagination, чтобы отключить сохранение страницы в URL:
<?php
namespace AppLivewire;
use LivewireComponent;
use LivewireWithPagination;
use LivewireWithoutUrlPagination;
use AppModelsUser;
class UserList extends Component
{
use WithPagination, WithoutUrlPagination;
public function render()
{
$users = User::paginate(10);
return view('livewire.user-list', ['users' => $users]);
}
}
?>
<div>
@foreach ($users as $user)
<div>{{ $user->name }}</div>
@endforeach
{{ $users->links() }}
</div>
Теперь при переходе на вторую страницу URL останется без параметра page, а при обновлении страницы компонент покажет первую страницу по умолчанию.
Пример с фильтрацией
При использовании фильтров важно помнить, что без WithoutUrlPagination страница и фильтры могут сохраняться вместе. Рассмотрим компонент с поиском, где отключение пагинации из URL будет полезно:
<?php
namespace AppLivewire;
use LivewireComponent;
use LivewireWithPagination;
use LivewireWithoutUrlPagination;
use AppModelsProduct;
class ProductList extends Component
{
use WithPagination, WithoutUrlPagination;
public $search = '';
public function updatingSearch()
{
$this->resetPage();
}
public function render()
{
$products = Product::where('name', 'like', '%' . $this->search . '%')
->paginate(10);
return view('livewire.product-list', [
'products' => $products
]);
}
}
?>
<div>
<input type="text" wire:model.live="search" placeholder="Search...">
@foreach ($products as $product)
<div>{{ $product->name }}</div>
@endforeach
{{ $products->links() }}
</div>
Благодаря классу WithoutUrlPagination при вводе поискового запроса URL остаётся чистым, а страница всегда сбрасывается на первую при изменении фильтра.
Смотрите также
-
трейт
WithPagination,
который добавляет функциональность пагинации в компонент Livewire -
метод
resetPage,
который сбрасывает пагинацию на первую страницу -
метод
setPage,
который устанавливает конкретную страницу пагинации -
класс
WithQueryString,
который управляет синхронизацией свойств с URL