Начало работы с Dropup
Dropup — это легковесная headless-библиотека для загрузки файлов в React, которая даёт вам полный контроль над пользовательским интерфейсом, обрабатывая всю сложную логику загрузки.
Почему Dropup?
- 🪶 Легковесность — Ядро всего ~10KB в сжатом виде (gzip)
- 🎨 Headless — Полный контроль над UI с API на основе хуков
- 📁 Drag & Drop — Встроенная поддержка перетаскивания
- 📊 Отслеживание прогресса — Прогресс загрузки в реальном времени для каждого файла
- 🔄 Чанковая загрузка — Разбиение больших файлов для надёжной загрузки
- ☁️ Готов к облаку — Готовые помощники для S3, GCS и Azure
- 🖼️ Обработка изображений — Встроенное сжатие и генерация превью
- 📱 Кроссплатформенность — Работает с React DOM и React Native
- 🔒 TypeScript — Полная поддержка TypeScript
Установка
Установите Dropup с помощью вашего предпочитаемого менеджера пакетов:
npm install @samithahansaka/dropup
Peer-зависимости
Dropup требует React 16.8 или выше (для поддержки хуков):
npm install react
Быстрый старт
Вот простой пример для начала работы:
import { useDropup } from '@samithahansaka/dropup';
function FileUploader() {
const {
files,
state,
actions,
getDropProps,
getInputProps
} = useDropup({
accept: 'image/*',
maxSize: 10 * 1024 * 1024, // 10MB
multiple: true,
});
return (
<div>
{/* Зона для сброса файлов */}
<div
{...getDropProps()}
style={{
border: state.isDragging ? '2px dashed blue' : '2px dashed gray',
padding: 40,
textAlign: 'center',
cursor: 'pointer',
}}
>
<input {...getInputProps()} />
<p>Перетащите файлы сюда или нажмите для выбора</p>
</div>
{/* Список файлов */}
<ul>
{files.map((file) => (
<li key={file.id}>
{file.name} - {file.status}
{file.status === 'uploading' && ` (${file.progress}%)`}
<button onClick={() => actions.remove(file.id)}>Удалить</button>
</li>
))}
</ul>
{/* Кнопка загрузки */}
{files.length > 0 && (
<button onClick={() => actions.upload()}>
Загрузить все
</button>
)}
</div>
);
}
Основные концепции
1. Хук useDropup
Хук useDropup — это основная точка входа. Он возвращает всё необходимое для создания интерфейса загрузки файлов:
const {
files, // Массив файлов со статусом, прогрессом и т.д.
state, // Общее состояние (isDragging, isUploading, progress)
actions, // Методы для загрузки, удаления, отмены, сброса
getDropProps, // Пропсы для вашего элемента зоны сброса
getInputProps, // Пропсы для скрытого input файла
} = useDropup(options);
2. Объекты файлов
Каждый файл в массиве files содержит:
{
id: string; // Уникальный идентификатор
file: File; // Оригинальный объект File
name: string; // Имя файла
size: number; // Размер файла в байтах
type: string; // MIME-тип
preview?: string; // URL для превью (для изображений)
status: 'idle' | 'uploading' | 'complete' | 'error';
progress: number; // Прогресс загрузки (0-100)
error?: Error; // Объект ошибки, если загрузка не удалась
uploadedUrl?: string; // URL после успешной загрузки
}
3. Действия
Объект actions предоставляет методы для управления загрузками:
actions.upload(fileIds?) // Начать загрузку (всех или определённых файлов)
actions.cancel(fileId?) // Отменить загрузку(и)
actions.remove(fileId) // Удалить файл из списка
actions.reset() // Очистить все файлы
actions.retry(fileIds?) // Повторить неудавшиеся загрузки
Настройка загрузки
Чтобы включить реальную загрузку, укажите конфигурацию загрузки:
const { files } = useDropup({
upload: {
url: '/api/upload',
method: 'POST',
headers: {
'Authorization': 'Bearer token',
},
},
autoUpload: true, // Загружать автоматически при добавлении файлов
});
Следующие шаги
- Узнайте о параметрах валидации
- Посмотрите больше примеров
- Изучите интеграции с облачными хранилищами
- Ознакомьтесь с полным справочником API