РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
62 of 274 menu

Директива wire:sort

Директива wire:sort используется для создания сортируемых списков в компонентах Livewire. Она позволяет пользователям изменять порядок элементов через перетаскивание (drag-and-drop). В значении директивы передаётся имя метода компонента, который будет вызываться после каждого изменения порядка. Метод получает текущий порядок элементов в виде массива их идентификаторов.

Синтаксис

<ul wire:sort="updateOrder"> @foreach ($items as $item) <li wire:key="item-{{ $item['id'] }}" wire:sort.item="{{ $item['id'] }}"> {{ $item['name'] }} <span wire:sort.handle>⠿</span> </li> @endforeach </ul>

Базовый пример

Создадим компонент для управления списком задач. Пользователь может менять порядок задач перетаскиванием.

<?php namespace App\Livewire; use Livewire\Component; class TaskList extends Component { public $tasks = [ ['id' => 1, 'name' => 'Task A'], ['id' => 2, 'name' => 'Task B'], ['id' => 3, 'name' => 'Task C'], ]; public function updateOrder($orderedIds) { $orderedTasks = []; foreach ($orderedIds as $id) { foreach ($this->tasks as $task) { if ($task['id'] == $id) { $orderedTasks[] = $task; break; } } } $this->tasks = $orderedTasks; } public function render() { return view('livewire.task-list'); } } ?>
<div> <ul wire:sort="updateOrder"> @foreach ($tasks as $task) <li wire:key="task-{{ $task['id'] }}" wire:sort.item="{{ $task['id'] }}"> <span wire:sort.handle>⠿</span> {{ $task['name'] }} </li> @endforeach </ul> <h3>Current order:</h3> <ul> @foreach ($tasks as $task) <li>{{ $task['name'] }}</li> @endforeach </ul> </div>

Пример с сортировкой массива

В этом примере мы сортируем список чисел. Метод получает новый порядок и обновляет массив.

<?php namespace App\Livewire; use Livewire\Component; class NumberList extends Component { public $numbers = [10, 20, 30, 40, 50]; public function reorder($orderedIds) { $orderedNumbers = []; foreach ($orderedIds as $id) { if (isset($this->numbers[$id])) { $orderedNumbers[] = $this->numbers[$id]; } } $this->numbers = $orderedNumbers; } public function render() { return view('livewire.number-list'); } } ?>
<div> <ul wire:sort="reorder"> @foreach ($numbers as $index => $number) <li wire:key="num-{{ $number }}" wire:sort.item="{{ $index }}"> <span wire:sort.handle>⠿</span> {{ $number }} </li> @endforeach </ul> </div>

После перетаскивания элементов Livewire вызовет метод reorder с массивом новых индексов, и список обновится.

Пример с группой сортировки

Если у вас несколько независимых списков, используйте директиву wire:sort.group для группировки.

<?php namespace App\Livewire; use Livewire\Component; class GroupSort extends Component { public $groupA = ['apple', 'banana', 'cherry']; public $groupB = ['date', 'elderberry', 'fig']; public function updateGroupA($orderedIds) { $ordered = []; foreach ($orderedIds as $id) { $ordered[] = $this->groupA[$id]; } $this->groupA = $ordered; } public function updateGroupB($orderedIds) { $ordered = []; foreach ($orderedIds as $id) { $ordered[] = $this->groupB[$id]; } $this->groupB = $ordered; } public function render() { return view('livewire.group-sort'); } } ?>
<div> <h4>Group A</h4> <ul wire:sort.group="groupA" wire:sort="updateGroupA"> @foreach ($groupA as $index => $value) <li wire:key="a-{{ $index }}" wire:sort.item="{{ $index }}"> <span wire:sort.handle>⠿</span> {{ $value }} </li> @endforeach </ul> <h4>Group B</h4> <ul wire:sort.group="groupB" wire:sort="updateGroupB"> @foreach ($groupB as $index => $value) <li wire:key="b-{{ $index }}" wire:sort.item="{{ $index }}"> <span wire:sort.handle>⠿</span> {{ $value }} </li> @endforeach </ul> </div>

Смотрите также

  • директиву wire:sort.item,
    которая задаёт идентификатор элемента для сортировки
  • директиву wire:sort.group,
    которая группирует связанные списки
  • директиву wire:sort.handle,
    которая определяет элемент для захвата при перетаскивании
  • директиву wire:key,
    которая обеспечивает уникальную идентификацию элементов в цикле
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить