Пользовательские наложения перетаскивания и DnD между контейнерами
Отображайте пользовательские предварительные просмотры перетаскивания с помощью DragOverlay и реализуйте взаимодействие перетаскивания между контейнерами в стиле канбан
«Пользовательские наложения перетаскивания и DnD между контейнерами» — бесплатный урок React Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
DragOverlay как портал
DragOverlay отображает содержимое как портал React, добавляя его непосредственно в document.body, а не внутрь дерева DOM DndContext. Поэтому его никогда не обрезают контейнеры с overflow:hidden или overflow:scroll, и он всегда отображается поверх остальных элементов без необходимости вручную управлять z-index.
Визуальная независимость оверлея
Поскольку DragOverlay отделён от исходного элемента, ему можно задать визуальные стили, которые нарушили бы разметку при применении к исходному элементу. Вы можете добавить тень, масштабирование (сделать его немного больше исходного элемента) или эффект поворота. Эти визуальные признаки сообщают пользователю, что элемент «поднят» и находится в движении.
Отслеживание activeDragId
DragOverlay должен знать, что именно отображать. Отслеживайте активный ID перетаскивания в состоянии: задайте его в onDragStart с помощью event.active.id, а в onDragEnd очистите, присвоив null. Внутри DragOverlay используйте этот ID, чтобы найти соответствующие данные элемента и отобразить правильный компонент предпросмотра.
Заполнитель на исходной позиции
При использовании DragOverlay исходный перетаскиваемый элемент должен становиться визуальным заполнителем во время перетаскивания. При использовании useSortable задайте нулевую непрозрачность или пунктирную границу, когда isDragging равно true. Это показывает «место», куда элемент вернётся при отмене перетаскивания, а также промежуток, который он оставляет при перемещении на новую позицию.
Настройка перетаскивания между несколькими контейнерами
Перетаскивание между несколькими контейнерами означает, что элементы можно перемещать между двумя или более отдельными списками. Для настройки нужен один DndContext, оборачивающий все контейнеры, при этом у каждого контейнера должен быть собственный SortableContext. Идентификаторы всех элементов во всех контейнерах должны быть глобально уникальными, чтобы предотвратить столкновения.
Использование onDragOver для перемещения между контейнерами
Для плавной анимации между контейнерами обновляйте состояние в onDragOver, а не ждите onDragEnd. Когда перетаскиваемый элемент попадает в новый контейнер, немедленно переместите его из исходного контейнера в целевой. Это обеспечивает визуальную обратную связь в реальном времени и показывает, где окажется элемент.
Уникальные идентификаторы во всех контейнерах
При перетаскивании между несколькими экземплярами SortableContext все идентификаторы элементов должны быть уникальными во всём DndContext, а не только внутри каждого списка. Если два контейнера используют один идентификатор, dnd-kit не сможет определить, какой элемент активен. Используйте UUID или добавляйте к идентификаторам имя контейнера, чтобы обеспечить глобальную уникальность.
active.data.current для пользовательских метаданных
useDraggable и useSortable принимают параметр data: useSortable({ id, data: { containerId, type } }). Эти данные доступны в обратных вызовах событий перетаскивания как event.active.data.current. В сценариях с несколькими контейнерами можно сохранить в данных идентификатор исходного контейнера и использовать его в onDragOver, чтобы определить, откуда перемещается элемент.
Обновление состояния контейнеров при перетаскивании
Состояние нескольких контейнеров обычно представляет собой объект, ключами которого служат идентификаторы контейнеров, а значениями — массивы элементов. В onDragOver, если активный элемент находится не в том же контейнере, что и цель под курсором, удалите элемент из массива исходного контейнера и вставьте его в массив целевого контейнера на правильную позицию.
Доступная навигация между контейнерами
KeyboardSensor работает и при перетаскивании между несколькими контейнерами. Пользователи нажимают клавиши со стрелками, чтобы перемещаться между элементами внутри контейнера, а при достижении его края могут продолжить перемещение в соседний контейнер. Алгоритм collisionDetection в SortableContext определяет ближайшую допустимую цель отпускания на основе положения.
Алгоритмы обнаружения столкновений
DndContext принимает свойство collisionDetection, определяющее, как вычисляется зона отпускания, над которой находится перетаскиваемый элемент. Стратегия по умолчанию closestCenter хорошо подходит для большинства списков. closestCorners лучше подходит для сеток. pointerWithin активирует зону отпускания только тогда, когда курсор физически находится внутри неё.
Поведение портала DragOverlay
Где DragOverlay отображает своё содержимое в DOM?
Итоги урока: оверлеи и несколько контейнеров
DragOverlay отображается как портал в document.body, сохраняя визуальную независимость от ограничений разметки. Отслеживайте activeDragId в onDragStart и onDragEnd, чтобы отображать правильное содержимое оверлея. Перетаскивание между несколькими контейнерами использует несколько экземпляров SortableContext внутри одного DndContext с глобально уникальными идентификаторами. Обновляйте состояние в onDragOver для плавной анимации между контейнерами, используя event.active.data.current для получения метаданных исходного контейнера.
Изучай React с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 88
- Уроки
- 324
Часто задаваемые вопросы
Урок «Пользовательские наложения перетаскивания и DnD между контейнерами» бесплатный?
Да — полный текст урока «Пользовательские наложения перетаскивания и DnD между контейнерами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Пользовательские наложения перетаскивания и DnD между контейнерами»?
Отображайте пользовательские предварительные просмотры перетаскивания с помощью DragOverlay и реализуйте взаимодействие перетаскивания между контейнерами в стиле канбан Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Пользовательские наложения перетаскивания и DnD между контейнерами»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Архитектура dnd-kit и дизайн с приоритетом доступности
- DndContext, useDraggable и useDroppable
- SortableContext для изменяемых порядком списков
- Пользовательские наложения перетаскивания и DnD между контейнерами