0Pricing
React Academy · Урок

SortableContext для изменяемых порядком списков

Используйте SortableContext и useSortable для создания списков с изменяемым порядком и плавными анимациями

«SortableContext для изменяемых порядком списков» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Назначение SortableContext

SortableContext — это специализированный компонент dnd-kit, который оборачивает список с поддержкой перестановки элементов. В то время как useDraggable и useDroppable обрабатывают произвольное перетаскивание, SortableContext предназначен именно для случаев, когда элементы списка нужно переставлять, перетаскивая их на новую позицию.

Свойство items

SortableContext требует свойство items: массив уникальных строковых или числовых идентификаторов, соответствующих идентификаторам, используемым во вложенных сортируемых компонентах. Порядок элементов в этом массиве определяет текущий порядок элементов. Когда Вы обновляете этот массив в состоянии, список повторно отображается в новом порядке.

Стратегии сортировки

SortableContext принимает свойство strategy, которое управляет сортировкой элементов. verticalListSortingStrategy предназначена для вертикальных списков и вычисляет точку вставки на основе вертикального положения. horizontalListSortingStrategy предназначена для горизонтальных списков. rectSortingStrategy предназначена для сеток. Выберите стратегию, соответствующую Вашей разметке.

Хук useSortable

Внутри SortableContext каждый элемент списка использует хук useSortable({ id }) вместо useDraggable. useSortable — это расширенная версия useDraggable: он возвращает те же атрибуты, обработчики, setNodeRef и transform, а также дополнительные значения для сортировки, такие как isDragging и overIndex.

isDragging для визуального состояния

Значение isDragging из useSortable равно true, пока элемент активно перетаскивается. Обычно его используют, чтобы уменьшить непрозрачность исходного элемента в списке или применить к нему стиль заполнителя во время перетаскивания. Этот визуальный пробел показывает пользователю, где сейчас находится элемент в списке.

Утилита arrayMove

dnd-kit экспортирует утилиту arrayMove(array, fromIndex, toIndex) из @dnd-kit/sortable. Она возвращает новый массив, в котором элемент с позиции fromIndex перемещён на позицию toIndex. Это стандартный способ обновить массив состояния после завершения перетаскивания для сортировки.

Реализация onDragEnd для сортировки

В обратном вызове onDragEnd компонента DndContext для сортируемого списка найдите старый и новый индексы с помощью items.indexOf(event.active.id) и items.indexOf(event.over?.id). Если оба индекса допустимы и различаются, вызовите setItems(arrayMove(items, oldIndex, newIndex)), чтобы изменить порядок массива.

Плавная анимация перемещаемых элементов

Когда элемент перетаскивается, остальные элементы списка перемещаются с анимацией на новые позиции, показывая, где окажется перетаскиваемый элемент. useSortable предоставляет CSS-трансформацию для каждого неперетаскиваемого элемента, освобождая для него место. Добавление CSS-перехода к этой трансформации создаёт плавную анимацию перемещения.

Переход для плавного перемещения

Примените CSS-переход к свойству трансформации сортируемых элементов: transition: isDragging ? undefined : transform ? 'transform 200ms ease' : undefined. Когда элемент перетаскивается, переход не нужен: он должен напрямую следовать за курсором. При перемещении элемента переход создаёт плавную анимацию скольжения.

Объединение с DragOverlay

Для лучшего пользовательского опыта объедините SortableContext с DragOverlay. Перетаскиваемый элемент в списке становится полупрозрачным заполнителем (с использованием isDragging), а DragOverlay отображает его непрозрачную приподнятую копию, следующую за курсором. Такой подход предотвращает визуальные скачки, при которых перетаскиваемый элемент перемещается между позициями.

Вертикальные и горизонтальные списки

SortableContext одинаково хорошо работает с вертикальными списками (досками задач, списками дел) и горизонтальными списками (панелями вкладок, каруселями изображений). Переключайтесь между стратегиями, изменяя свойство strategy. Его также можно использовать для сетки со стратегией rectSortingStrategy, которая вычисляет ближайшую ячейку сетки на основе положения перетаскиваемого элемента.

arrayMove в onDragEnd

Какие аргументы принимает arrayMove при вызове внутри onDragEnd для изменения порядка сортируемого списка?

Итоги урока: SortableContext

SortableContext оборачивает список с поддержкой перестановки и требует массив items с уникальными идентификаторами и стратегию (вертикальную, горизонтальную или сеточную). Каждый элемент использует useSortable вместо useDraggable, получая isDragging и overIndex. В onDragEnd функция arrayMove(items, oldIndex, newIndex) изменяет порядок массива. CSS-переходы для трансформации обеспечивают плавную анимацию перемещаемых элементов.

Часто задаваемые вопросы

Урок «SortableContext для изменяемых порядком списков» бесплатный?

Да — полный текст урока «SortableContext для изменяемых порядком списков» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «SortableContext для изменяемых порядком списков»?

Используйте SortableContext и useSortable для создания списков с изменяемым порядком и плавными анимациями Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «SortableContext для изменяемых порядком списков»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Архитектура dnd-kit и дизайн с приоритетом доступности
  2. DndContext, useDraggable и useDroppable
  3. SortableContext для изменяемых порядком списков
  4. Пользовательские наложения перетаскивания и DnD между контейнерами
← Назад к React Academy