0Pricing
React Academy · Урок

Интерфейс загрузки файлов перетаскиванием

Создайте область перетаскивания с событиями onDragOver/onDrop и визуальной обратной связью

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

Добро пожаловать

В этом уроке Вы создадите в React зону загрузки файлов с поддержкой перетаскивания, используя нативные события перетаскивания и визуальную обратную связь, которая будет направлять пользователей.

Обзор событий перетаскивания

Браузер вызывает события перетаскивания, когда файлы перемещаются над элементами. Ключевые события: `dragover` (файл находится над элементом), `dragleave` (файл покидает элемент) и `drop` (файл отпускается).

Предотвращение поведения по умолчанию

По умолчанию при сбрасывании файла в браузер происходит переход к этому файлу. Вызовите `e.preventDefault()` в обоих обработчиках `onDragOver` и `onDrop`, чтобы предотвратить такое поведение.
const handleDragOver = (e) => {
  e.preventDefault();
};
const handleDrop = (e) => {
  e.preventDefault();
  const files = Array.from(e.dataTransfer.files);
  // process files
};

Визуальное активное состояние

Отслеживайте с помощью логического состояния, перетаскивается ли файл над зоной. Переключайте CSS-класс, чтобы обеспечить пользователям визуальную обратную связь, например подсвеченную границу.
const [isDragging, setIsDragging] = useState(false);

<div
  className={isDragging ? 'zone active' : 'zone'}
  onDragOver={(e) => { e.preventDefault(); setIsDragging(true); }}
  onDragLeave={() => setIsDragging(false)}
  onDrop={handleDrop}
>

Чтение сброшенных файлов

Сброшенные файлы находятся в `e.dataTransfer.files` — это объект `FileList`. Преобразуйте его в массив и обработайте файлы.
const handleDrop = (e) => {
  e.preventDefault();
  setIsDragging(false);
  const files = Array.from(e.dataTransfer.files);
  setSelectedFiles(files);
};

Объединение с выбором по щелчку

Сделайте зону перетаскивания также доступной для щелчка: отобразите скрытое поле выбора файла и программно вызывайте его при щелчке по зоне.
const inputRef = useRef();

<div onClick={() => inputRef.current.click()} ...>
  Drop files here or click to browse
</div>
<input
  ref={inputRef}
  type="file"
  multiple
  hidden
  onChange={(e) => setSelectedFiles(Array.from(e.target.files))}
/>

Отображение предварительных просмотров файлов

Переберите выбранные файлы, чтобы отобразить их имена и размеры. Для изображений создайте URL предварительного просмотра с помощью URL.createObjectURL и отзывайте их в эффекте очистки.

Удаление файлов перед загрузкой

Позвольте пользователям удалять файлы до загрузки, отфильтровывая массив выбранных файлов. Обновите состояние отфильтрованным массивом.
const removeFile = (index) =>
  setSelectedFiles(files => files.filter((_, i) => i !== index));

Сравнение dragenter и dragover

Используйте `dragenter`, чтобы определить момент первого входа перетаскиваемого объекта в зону, а `dragover` — чтобы сохранять активное состояние во время наведения. Для вложенных дочерних элементов используйте счётчик: увеличивайте его при dragenter, уменьшайте при dragleave и сбрасывайте при drop.

Сторонние библиотеки

Для рабочих зон перетаскивания рассмотрите **react-dropzone** — библиотека из коробки обрабатывает особенности браузеров, атрибуты ARIA, фильтрацию типов файлов и несколько режимов загрузки.
import { useDropzone } from 'react-dropzone';
const { getRootProps, getInputProps, isDragActive } = useDropzone({
  onDrop: acceptedFiles => setFiles(acceptedFiles),
  accept: { 'image/*': [] },
});

Быстрая проверка

Почему необходимо вызвать e.preventDefault() в обработчике onDragOver?

Итоги

Создайте зону перетаскивания с событиями onDragOver, onDragLeave и onDrop. Всегда вызывайте e.preventDefault() при dragover и drop. Отслеживайте состояние isDragging для визуальной обратной связи. Объедините зону со скрытым полем выбора файла, чтобы поддержать выбор по щелчку.

Далее

Следующий урок: **Загрузка файлов в серверный API** — Вы будете использовать FormData и fetch, чтобы отправлять файлы методом POST и отслеживать ход загрузки.

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

Урок «Интерфейс загрузки файлов перетаскиванием» бесплатный?

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

Чему я научусь в уроке «Интерфейс загрузки файлов перетаскиванием»?

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

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

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

Сколько времени занимает урок «Интерфейс загрузки файлов перетаскиванием»?

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

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

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

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

  1. Неконтролируемые поля ввода с useRef
  2. Поле выбора файла и чтение данных файла
  3. Интерфейс загрузки файлов перетаскиванием
  4. Загрузка файлов в серверный API
← Назад к React Academy