Перейти к основному содержимому

Справочник по возвращаемым значениям

Всё, что возвращается хуком useDropup.

Обзор​

const {
files, // Массив объектов файлов
state, // Текущее состояние
actions, // Доступные действия
getDropProps, // Свойства для зоны сброса
getInputProps, // Свойства для элемента input
openFileDialog, // Открыть выбор файла
} = useDropup();

files​

Массив объектов DropupFile, представляющих все добавленные файлы.

const { files } = useDropup();

files.forEach(file => {
console.log(file.id); // "abc123"
console.log(file.name); // "photo.jpg"
console.log(file.size); // 1234567
console.log(file.type); // "image/jpeg"
console.log(file.status); // "idle" | "uploading" | "complete" | "error"
console.log(file.progress); // 0-100
console.log(file.preview); // "blob:http://..." (только изображения)
console.log(file.uploadedUrl); // "https://..." (после загрузки)
console.log(file.error); // DropupError (при провале)
});

Свойства DropupFile​

СвойствоТипОписание
idstringУникальный идентификатор
fileFileИсходный объект File браузера
namestringИмя файла
sizenumberРазмер в байтах
typestringMIME тип
statusFileStatusТекущий статус
progressnumberПрогресс загрузки (0-100)
previewstring | undefinedURL превью для изображений
uploadedUrlstring | undefinedURL после успешной загрузки
responseunknownДанные ответа сервера
errorDropupError | undefinedОшибка при провале загрузки
metaRecord<string, unknown>Пользовательские метаданные

Значения FileStatus​

СтатусОписание
'idle'Файл добавлен, не загружается
'uploading'Загрузка в процессе
'complete'Загрузка успешна
'error'Загрузка провалена
'paused'Загрузка приостановлена (возобновляемые загрузки)

state​

Текущее состояние зоны сброса.

const { state } = useDropup();

console.log(state.isDragging); // true при перетаскивании
console.log(state.isDragAccept); // true когда перетаскиваемые файлы валидны
console.log(state.isDragReject); // true когда перетаскиваемые файлы невалидны
console.log(state.isUploading); // true когда какой-либо файл загружается
console.log(state.progress); // общий прогресс 0-100
console.log(state.status); // 'idle' | 'uploading' | 'complete' | 'error'

Свойства State​

СвойствоТипОписание
isDraggingbooleanФайлы перетаскиваются над зоной сброса
isDragAcceptbooleanПеретаскиваемые файлы проходят валидацию
isDragRejectbooleanПеретаскиваемые файлы не проходят валидацию
isUploadingbooleanКакой-либо файл в данный момент загружается
progressnumberСредний прогресс всех файлов (0-100)
statusDropupStatusОбщий статус загрузки

Значения DropupStatus​

СтатусОписание
'idle'Нет загрузок в процессе
'uploading'Один или более файлов загружается
'complete'Все загрузки завершены успешно
'error'Одна или более загрузок провалены

actions​

Объект, содержащий все доступные действия.

const { actions } = useDropup();

// Начать загрузки
actions.upload(); // Загрузить все неактивные файлы
actions.upload(['id1', 'id2']); // Загрузить конкретные файлы

// Отменить загрузки
actions.cancel(); // Отменить все загрузки
actions.cancel('file-id'); // Отменить конкретный файл

// Удалить файлы
actions.remove('file-id'); // Удалить конкретный файл
actions.reset(); // Удалить все файлы

// Повторить проваленные загрузки
actions.retry(); // Повторить все проваленные
actions.retry(['id1']); // Повторить конкретные файлы

// Добавить файлы программно
actions.addFiles(fileList); // Добавить File[] или FileList

// Обновить метаданные файла
actions.updateFileMeta('file-id', { tag: 'important' });

Методы действий​

upload(fileIds?)​

Начать загрузку файлов.

// Загрузить все неактивные файлы
actions.upload();

// Загрузить конкретные файлы
actions.upload(['file-id-1', 'file-id-2']);
ПараметрТипОписание
fileIdsstring[] (необязательно)Конкретные ID файлов для загрузки

cancel(fileId?)​

Отменить текущие загрузки.

// Отменить все загрузки
actions.cancel();

// Отменить конкретный файл
actions.cancel('file-id');
ПараметрТипОписание
fileIdstring (необязательно)Конкретный ID файла для отмены

remove(fileId)​

Удалить файл из списка.

actions.remove('file-id');
ПараметрТипОписание
fileIdstringID файла для удаления

reset()​

Удалить все файлы и сбросить состояние.

actions.reset();

retry(fileIds?)​

Повторить проваленные загрузки.

// Повторить все проваленные загрузки
actions.retry();

// Повторить конкретные файлы
actions.retry(['file-id-1']);
ПараметрТипОписание
fileIdsstring[] (необязательно)Конкретные ID файлов для повтора

addFiles(files)​

Добавить файлы программно.

// Из буфера обмена
document.addEventListener('paste', (e) => {
const files = e.clipboardData?.files;
if (files) {
actions.addFiles(files);
}
});

// Из другого источника
actions.addFiles([file1, file2]);
ПараметрТипОписание
filesFile[] | FileListФайлы для добавления

updateFileMeta(fileId, meta)​

Обновить метаданные файла.

actions.updateFileMeta('file-id', {
description: 'Моя фотография',
tags: ['отпуск', '2024'],
});
ПараметрТипОписание
fileIdstringID файла для обновления
metaRecord<string, unknown>Метаданные для слияния

getDropProps​

Возвращает свойства для распространения на элемент зоны сброса.

const { getDropProps, getInputProps } = useDropup();

<div {...getDropProps()}>
<input {...getInputProps()} />
Перетащите файлы сюда
</div>

С пользовательскими свойствами​

<div
{...getDropProps({
className: 'my-dropzone',
onClick: (e) => {
// Ваш пользовательский обработчик клика
console.log('Клик!');
},
})}
>
<input {...getInputProps()} />
</div>

Возвращаемые свойства​

СвойствоТипОписание
onDragEnterfunctionОбработчик входа при перетаскивании
onDragOverfunctionОбработчик нахождения над при перетаскивании
onDragLeavefunctionОбработчик выхода при перетаскивании
onDropfunctionОбработчик сброса
onClickfunctionОбработчик клика (открывает диалог)
rolestringРоль для доступности
tabIndexnumberИндекс табуляции для фокуса

getInputProps​

Возвращает свойства для распространения на скрытый файловый input.

const { getInputProps } = useDropup();

<input {...getInputProps()} />

С пользовательскими свойствами​

<input
{...getInputProps({
id: 'file-input',
name: 'files',
})}
/>

Возвращаемые свойства​

СвойствоТипОписание
type'file'Тип input
acceptstringПринимаемые типы файлов
multiplebooleanРазрешить несколько файлов
onChangefunctionОбработчик изменения
styleobjectСкрывающие стили

openFileDialog​

Функция для программного открытия выбора файлов.

const { openFileDialog } = useDropup();

<button onClick={openFileDialog}>
Обзор файлов
</button>

Примеры использования​

Полный список файлов​

function FileList() {
const { files, actions, state } = useDropup({
upload: { url: '/api/upload' },
});

return (
<div>
<h3>Файлы ({files.length})</h3>

{files.map(file => (
<div key={file.id}>
{file.preview && (
<img src={file.preview} alt="" width={50} />
)}
<span>{file.name}</span>
<span>{(file.size / 1024).toFixed(1)} КБ</span>
<span>{file.status}</span>

{file.status === 'uploading' && (
<progress value={file.progress} max={100} />
)}

{file.status === 'error' && (
<>
<span style={{ color: 'red' }}>{file.error?.message}</span>
<button onClick={() => actions.retry([file.id])}>Повторить</button>
</>
)}

<button onClick={() => actions.remove(file.id)}>Удалить</button>
</div>
))}

{state.isUploading && (
<p>Загрузка... {state.progress}%</p>
)}

<button
onClick={() => actions.upload()}
disabled={state.isUploading || files.length === 0}
>
Загрузить все
</button>

<button onClick={() => actions.reset()}>
Очистить всё
</button>
</div>
);
}

Стилизация состояния перетаскивания​

function StyledDropzone() {
const { state, getDropProps, getInputProps } = useDropup({
accept: 'image/*',
});

const getStyle = () => {
if (state.isDragAccept) return { borderColor: 'green', backgroundColor: '#e8f5e9' };
if (state.isDragReject) return { borderColor: 'red', backgroundColor: '#ffebee' };
if (state.isDragging) return { borderColor: 'blue', backgroundColor: '#e3f2fd' };
return { borderColor: 'gray', backgroundColor: 'white' };
};

return (
<div
{...getDropProps()}
style={{
border: '2px dashed',
borderRadius: 8,
padding: 40,
textAlign: 'center',
transition: 'all 0.2s',
...getStyle(),
}}
>
<input {...getInputProps()} />
{state.isDragReject ? (
<p>Принимаются только изображения!</p>
) : (
<p>Перетащите изображения сюда</p>
)}
</div>
);
}