DndContext, useDraggable и useDroppable
Подключите провайдер DndContext и создайте перетаскиваемые и принимающие элементы с соответствующими хуками
«DndContext, useDraggable и useDroppable» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Обертывание функциональности в DndContext
Каждую функциональность перетаскивания в dnd-kit необходимо обернуть в компонент DndContext. DndContext — это координационный узел: он отслеживает активные перетаскивания, обеспечивает взаимодействие между перетаскиваемыми элементами и целями сброса и запускает обратные вызовы событий. Обычно его размещают на уровне компонента, который управляет состоянием перетаскивания.
Устройство хука useDraggable
Хук useDraggable({ id }) делает компонент перетаскиваемым. Он возвращает четыре ключевых значения: атрибуты (свойства ARIA, которые нужно передать элементу), обработчики (обработчики событий для начала перетаскивания), setNodeRef (подключает ссылку на перетаскиваемый элемент) и преобразование (текущее смещение в виде {x, y, scaleX, scaleY}).
Применение useDraggable к элементу
Чтобы подключить перетаскиваемый элемент, передайте attributes и listeners этому элементу, а setNodeRef укажите в свойстве ref. Атрибуты включают role="button", tabIndex и свойства aria. Обработчики подключают события указателя и клавиатуры, необходимые dnd-kit для обнаружения начала перетаскивания.
Применение стиля преобразования
Значение transform из useDraggable равно null, когда перетаскивание не выполняется, и представляет собой объект координат во время перетаскивания. Преобразуйте его в строку CSS с помощью CSS.Translate.toString(transform) из пакета @dnd-kit/utilities. Примените результат как свойство CSS transform к перетаскиваемому элементу, чтобы визуально перемещать его вслед за курсором.
Устройство хука useDroppable
Хук useDroppable({ id }) отмечает контейнер как допустимую цель сброса. Он возвращает isOver (логическое значение, равное true, пока перетаскиваемый элемент находится над этой целью сброса) и setNodeRef для подключения ссылки к элементу цели сброса. В отличие от useDraggable, обработчики событий передавать не нужно.
Визуальная обратная связь с помощью isOver
Значение isOver из useDroppable позволяет отображать визуальную обратную связь во время перетаскивания. Когда isOver имеет значение true, можно изменить цвет подсветки, границу или фон зоны сброса. Это помогает пользователям понять, куда можно отпустить элемент, что важно для удобства использования и доступности.
onDragEnd: чтение результата
Обратный вызов onDragEnd в DndContext получает объект события с двумя важными свойствами: event.active содержит перетаскиваемый элемент, включая его id, а event.over содержит цель сброса или null, если элемент отпустили за пределами любой цели сброса. Используйте эти идентификаторы для обновления состояния приложения.
Обновление состояния после отпускания
В onDragEnd после проверки того, что event.over не равно null, обновите состояние, чтобы отразить перемещение. Например, если Вы перемещаете карточку между столбцами на доске Kanban, удалите карточку из исходного столбца и добавьте её в целевой столбец, определённый с помощью event.over.id.
DragOverlay для плавающего предпросмотра
DragOverlay отображает плавающий предпросмотр перетаскиваемого элемента, следующий за курсором. Он отображается как портал (вне обычного дерева DOM), поэтому его никогда не обрезают контейнеры с overflow:hidden. В отличие от исходного элемента, оверлей может иметь тени, масштабирование или поворот, показывающие, что элемент перетаскивается.
Отслеживание activeDragId для оверлея
Чтобы отобразить правильное содержимое в DragOverlay, отслеживайте, какой элемент сейчас перетаскивается, используя обратный вызов onDragStart. Сохраните активный ID в состоянии: setActiveDragId(event.active.id). В onDragEnd сбросьте его в null. Внутри DragOverlay используйте activeDragId, чтобы найти нужный элемент и отобразить его.
Объединение перетаскиваемых элементов и зон отпускания
Настоящий интерфейс перетаскивания объединяет DndContext, несколько элементов useDraggable, несколько зон useDroppable и управление состоянием, отслеживающее, где находится каждый элемент. Главная идея заключается в том, что dnd-kit предоставляет механизм работы, а Вам нужно обновлять состояние в onDragEnd и повторно отображать интерфейс, чтобы отразить новое расположение.
Применение стиля трансформации
Какая утилита преобразует объект transform из useDraggable в строку CSS-трансформации?
Итоги урока: основные хуки
DndContext — координационный центр всех операций перетаскивания dnd-kit. useDraggable предоставляет атрибуты, обработчики, setNodeRef и transform для перетаскиваемых элементов. useDroppable предоставляет isOver и setNodeRef для целей отпускания. onDragEnd предоставляет event.active.id и event.over?.id, с помощью которых можно обновить состояние. DragOverlay отображает плавающий предпросмотр на основе портала.
Часто задаваемые вопросы
Урок «DndContext, useDraggable и useDroppable» бесплатный?
Да — полный текст урока «DndContext, useDraggable и useDroppable» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «DndContext, useDraggable и useDroppable»?
Подключите провайдер DndContext и создайте перетаскиваемые и принимающие элементы с соответствующими хуками Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «DndContext, useDraggable и useDroppable»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Архитектура dnd-kit и дизайн с приоритетом доступности
- DndContext, useDraggable и useDroppable
- SortableContext для изменяемых порядком списков
- Пользовательские наложения перетаскивания и DnD между контейнерами