Гид по технологиям

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

5 min read Frontend Обновлено 05 Dec 2025
Перетаскивание в React: руководство
Перетаскивание в React: руководство

Экран ПК с компонентом, который можно перетаскивать

Перетаскивание — это взаимодействие, в котором пользователь перемещает элемент по экрану мышью или пальцем. Оно подходит для изменения порядка списка, перемещения карточек между колонками и других интерактивных сценариев.

Ключевые варианты реализации:

  • Нативные события браузера (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.

Экран приложения React с перетаскиваемым компонентом

Библиотеки: удобство и дополнительные возможности

Если вам нужно более удобное 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) и клавиатурной навигации.

Интерфейс React‑приложения с перетаскиваемым элементом

Практические советы по улучшению UX

  1. Визуальная обратная связь
    • Меняйте прозрачность или добавляйте тень при перетаскивании.
    • Подсвечивайте допустимые зоны сброса.
  2. Ясность допустимых действий
    • Используйте типы (type) или dataTransfer, чтобы запретить неверные операции.
  3. Отмена операции
    • Добавьте кнопку или клавишу Esc для отмены перетаскивания.
  4. Поддержка сенсорных устройств
    • На мобильных устройствах HTML5 DnD может работать не во всех браузерах; рассмотрите библиотеку с поддержкой touch.
  5. Доступность
    • Добавьте ARIA‑роли (role=”listbox”, role=”option”, aria-grabbed) и возможности для управления с клавиатуры.

Когда стоит выбрать нативный подход, а когда — библиотеку

  • Нативный HTML5 — для простых задач: перетаскивание одиночных элементов, демонстрация, простые интерфейсы.
  • Библиотека — если нужно: колонки с упорядочиванием, анимации при перестановке, поддержка клавиатуры, сложные правила конфликтов.

Сравнение быстрых альтернатив

  • react-beautiful-dnd — хорошо для списков и досок Kanban, имеет плавные анимации и простую модель.
  • dnd-kit — гибкость и модульность, лучше для кастомных сценариев.
  • react-drag-and-drop — простая обёртка над HTML5, подходит для быстрых решений.

Мини‑методология внедрения DnD в проект (шпаргалка)

  1. Определите сценарии: перемещение внутри списка, между списками, абсолютное позиционирование.
  2. Выберите подход: нативный или библиотека.
  3. Прототип: реализуйте минимальную рабочую версию.
  4. Добавьте визуальные подсказки и анимации.
  5. Проведите тесты доступности и на мобильных устройствах.
  6. Напишите тесты (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‑кейсы в критериях приёмки.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Видеозадний фон в Microsoft Edge — включение и отключение
Руководства

Видеозадний фон в Microsoft Edge — включение и отключение

Исправление ошибки 0x800070002c-0x3000d в Windows 10
Windows

Исправление ошибки 0x800070002c-0x3000d в Windows 10

Cider — клиент Apple Music для Linux
Linux

Cider — клиент Apple Music для Linux

Как использовать FC в командной строке Windows
Командная строка

Как использовать FC в командной строке Windows

Как защитить Wi‑Fi от соседей
Сеть

Как защитить Wi‑Fi от соседей

Установка загрузчика на Arduino
Электроника

Установка загрузчика на Arduino