Перетаскивание (Drag & Drop) в React: как быстро и правильно добавить DnD

Перетаскивание — это взаимодействие, в котором пользователь перемещает элемент по экрану мышью или пальцем. Оно подходит для изменения порядка списка, перемещения карточек между колонками и других интерактивных сценариев.
Ключевые варианты реализации:
- Нативные события браузера (HTML5 Drag and Drop) — минимальные зависимости, больше контроля.
- Третьи библиотеки (react-beautiful-dnd, dnd-kit, react-drag-and-drop и др.) — удобные абстракции, готовая логика для списков, анимаций и доступности.
Способы реализации перетаскивания в React
Выберите метод после создания приложения React. Если задача простая — начните с нативного API, если нужна продвинутая логика — библиотека ускорит работу.
Нативный HTML5: обработчики onDrag / onDrop
Коротко: элемент становится перетаскиваемым через атрибут draggable. Используйте onDragStart, onDrag, onDragEnd и onDrop для управления.
Простой компонент класса (пример с комментариями на русском):
import React, { Component } from 'react';
class MyComponent extends Component {
handleDragStart(event) {
// Запускается при начале перетаскивания
console.log('Начато');
// Можно записать данные: event.dataTransfer.setData('text/plain', 'какие-то данные')
}
handleDrag(event) {
// Вызывается многократно во время перетаскивания
console.log('Перетаскивание...');
}
handleDragEnd(event) {
// Запускается при завершении перетаскивания
console.log('Завершено');
}
render() {
return (
Перетащи меня!
);
}
}
export default MyComponent;Функциональный компонент с позиционированием по окончании перетаскивания:
import React, { useState } from 'react';
function MyComponent() {
const [x, setX] = useState(0);
const [y, setY] = useState(0);
const handleDragEnd = (event) => {
// Координаты относительно окна браузера
setX(event.clientX);
setY(event.clientY);
};
return (
Перетащи меня!
);
}
export default MyComponent;Советы по нативной реализации:
- Используйте event.dataTransfer для передачи данных между источником и целью.
- На целевой области (drop zone) пропустите событие onDragOver и вызовите event.preventDefault(), иначе onDrop не сработает.
- Управляйте эффектами через event.dataTransfer.effectAllowed и event.dataTransfer.dropEffect.
Библиотеки: удобство и дополнительные возможности
Если вам нужно более удобное API, анимации, сохранение порядка списков и поддержка клавиатуры — используйте библиотеку. Примеры: react-beautiful-dnd (популярна для списков и канбан‑досок), dnd-kit (модульная и гибкая), react-drag-and-drop (обертка над HTML5).
Пример использования react-drag-and-drop (простая обёртка):
import React, { Component } from 'react';
import { Draggable, Droppable } from 'react-drag-and-drop';
class MyComponent extends Component {
handleDrop(data, event) {
// Вызывается при сбросе: data содержит переданные данные
console.log(data); // например: 'bar'
}
render() {
return (
Перетащи меня!
Отпустите здесь!
);
}
}
export default MyComponent;Почему выбирать библиотеку:
- Стабильное API для сложных операций.
- Поддержка анимаций и микровзаимодействий.
- Лучшие практики по доступности (ARIA) и клавиатурной навигации.
Практические советы по улучшению UX
- Визуальная обратная связь
- Меняйте прозрачность или добавляйте тень при перетаскивании.
- Подсвечивайте допустимые зоны сброса.
- Ясность допустимых действий
- Используйте типы (type) или dataTransfer, чтобы запретить неверные операции.
- Отмена операции
- Добавьте кнопку или клавишу Esc для отмены перетаскивания.
- Поддержка сенсорных устройств
- На мобильных устройствах HTML5 DnD может работать не во всех браузерах; рассмотрите библиотеку с поддержкой touch.
- Доступность
- Добавьте ARIA‑роли (role=”listbox”, role=”option”, aria-grabbed) и возможности для управления с клавиатуры.
Когда стоит выбрать нативный подход, а когда — библиотеку
- Нативный HTML5 — для простых задач: перетаскивание одиночных элементов, демонстрация, простые интерфейсы.
- Библиотека — если нужно: колонки с упорядочиванием, анимации при перестановке, поддержка клавиатуры, сложные правила конфликтов.
Сравнение быстрых альтернатив
- react-beautiful-dnd — хорошо для списков и досок Kanban, имеет плавные анимации и простую модель.
- dnd-kit — гибкость и модульность, лучше для кастомных сценариев.
- react-drag-and-drop — простая обёртка над HTML5, подходит для быстрых решений.
Мини‑методология внедрения DnD в проект (шпаргалка)
- Определите сценарии: перемещение внутри списка, между списками, абсолютное позиционирование.
- Выберите подход: нативный или библиотека.
- Прототип: реализуйте минимальную рабочую версию.
- Добавьте визуальные подсказки и анимации.
- Проведите тесты доступности и на мобильных устройствах.
- Напишите тесты (unit/integration) и сформулируйте критерии приёмки.
Критерии приёмки
- Элементы можно перетаскивать мышью и переносить в допустимую цель.
- Сбойные переносы отменяются без потери данных.
- Операция доступна с клавиатуры (перемещение с фокусом и подтверждение клавишей).
- На мобильных устройствах основной сценарий работает или есть альтернативный UX.
- Нет существенных падений производительности при большом количестве элементов.
Тестовые сценарии (примерные)
- Перетащить элемент внутри списка и проверить новый порядок.
- Перетащить элемент между разными целями и проверить передачу данных.
- Нажать Esc во время перетаскивания и убедиться, что операция отменена.
- Попробовать перетаскивание на мобильном устройстве (эмуляция touch).
- Тесты на скорость: массовое перемещение 50+ элементов — UI остаётся отзывчивым.
Чек‑лист ролей
- Разработчик: выбрать библиотеку/реализовать обработчики, покрыть тестами.
- Дизайнер: предоставить состояния для drag/over/invalid, анимации и макеты.
- QA: сценарии по критериям приёмки, тесты на разных устройствах.
- Продукт: утвердить сценарии отмены и поведения при ошибках.
Советы по производительности и масштабируемости
- Избегайте лишних перерендеров списка: применяйте React.memo и ключи элементов.
- Для больших списков используйте виртуализацию (react-window, react-virtualized) вместе с DnD — требуется аккуратная интеграция.
- Обновляйте состояние минимально: храните порядок в одном месте и изменяйте только его.
Риски и их смягчение
- Несовместимость с мобильными браузерами: тестируйте и при необходимости добавляйте альтернативный интерфейс.
- Проблемы с доступностью: реализуйте клавиатурное управление и ARIA‑атрибуты.
- Потери данных при ошибках: сохраняйте промежуточное состояние и давайте возможность отмены.
Совместимость и миграция
- Нативный HTML5 работает в большинстве десктопных браузеров, но может вести себя по‑разному в мобильных браузерах.
- При миграции на библиотеку проверьте конфликт версий React: некоторые библиотеки требуют React ≥16.8 (хуки).
Короткое объявление для пользователей (100–200 слов)
Мы добавили возможность перетаскивания элементов в интерфейс. Теперь вы можете изменить порядок карточек, перемещать задачи между колонками и удобно организовывать контент без перезагрузки страницы. Перетаскивание поддерживает визуальную подсветку целевых зон, отмену операции и работает на большинстве настольных браузеров. На мобильных устройствах предусмотрен альтернативный способ редактирования порядка. Если вы заметите проблемы с доступностью или отзывчивостью, пожалуйста, сообщите через службу поддержки.
Социальный предпросмотр
OG title: Перетаскивание в React — быстро и правильно OG description: Простое руководство по реализации DnD в React: нативный HTML5, библиотеки, UX‑советы и чек‑листы для разработки.
Краткое резюме
Перетаскивание в React — мощный инструмент для улучшения UX. Для простых задач хватит нативного API. Для сложных сценариев выбирайте специализированные библиотеки, проверяйте доступность, мобильную поддержку и оптимизируйте производительность.
Важно: тестируйте на реальных устройствах и описывайте edge‑кейсы в критериях приёмки.
Похожие материалы
Видеозадний фон в Microsoft Edge — включение и отключение
Исправление ошибки 0x800070002c-0x3000d в Windows 10
Cider — клиент Apple Music для Linux
Как использовать FC в командной строке Windows
Как защитить Wi‑Fi от соседей