Skip to content

SUpload

Загрузка файла. Всегда вставляется внутри некой формы, не используется в отрыве от неё.

В чем отличие от аналогов?

В отличие от популярных библиотек компонентов для Vue3:

  1. В других библиотеках Upload работает как поле, которое по дефолту сразу отправляет файл после выбора (что удобно, например, при импорте таблиц). На практике же гораздо чаще встречается кейс, когда файл/картинка — это атрибут некой модели, и этот файл нужно добавлять-редактировать в форме редактирования модели. SUpload в первую очередь заточен под этот, более частый кейс.
  2. SUpload сразу работает в связке с SForm, что позволяет использовать его так же просто, как простые текстовые SInput, не задумываясь о том, как связывать данные с формой.

Базовый пример

Если нужно вставить полем в форму. Сама отправка идёт через Inertia, поэтому базовый пример показан кодом (вживую не запускается):

<SUpload v-model="screenshot" />
<SButton v-if="screenshot" @click="submit">Отправить</SButton>

Авто-отправка при выборе

Если нужна авто-отправка, то выполняем отправку формы по событию @select:

Выбрать файл
<SUpload v-model="screenshot" @select="submit" />

Кастомный текст кнопки

Можно задать произвольный текст кнопки с помощью атрибута upload-button-title

Выбрать скриншот
<SUpload v-model="screenshot" upload-button-title="Выбрать скриншот" />

Кастомный шаблон

Перетащите файл сюда или нажмите для загрузки

<SUpload v-model="screenshot">
    <template #header="{ choose, clear, files, isDragging }">
        <div class="s-upload-area" :class="{ dragging: isDragging }">
            <FontAwesomeIcon icon="cloud-arrow-up" class="s-upload-area-icon" />
            <p>Перетащите файл сюда или <a href="javascript:void(0)" @click="choose">нажмите</a> для загрузки</p>
        </div>
    </template>
    <template #preview="{ files, remove }">
        <div v-if="files && files.length">
            Файл выбран <SActionIcon @click="remove(files[0])" icon="trash" />
        </div>
    </template>
</SUpload>

Слоты сразу пробрасывают методы и переменные, которые могут быть полезны в собственных шаблонах:

  • В слоте кнопки выбора #header: choose() открывает окно выбора файла, clear() очищает набор выбранных файлов, files — список текущих выбранных файлов, isDragging — булево значение, равное true, когда над компонентом перемещают файл.
  • В слоте предпросмотра выбранных файлов #preview: files — список текущих выбранных файлов, remove(file) — удаление конкретного файла из набора (передаётся элемент массива files).

Ограничения выбора

Для ограничения выбора по расширению добавляем атрибут accept:

Выбрать файл
<SUpload v-model="screenshot" accept=".txt,.csv,.xlsx" />

Для ограничения выбора по размеру файла добавляем атрибут max-file-size. Можно указывать человекочитаемо (2M, 512K, 1.5GB — единицы 1024-кратные, как в php.ini) или числом в байтах:

Выбрать файл
<SUpload v-model="screenshot" max-file-size="500K" />

Выбор нескольких файлов

Выбрать файлы
<SUpload v-model="screenshots" multiple />

Интерфейс компонента

Свойства (Props)

НазваниеТипПо умолчаниюОписание
v-modelany | any[]nullВыбранный файл (объект File или строка) или массив файлов.
acceptstringundefinedДопустимые типы файлов (напр. .jpg,.png).
max-file-sizenumber | stringundefinedМаксимальный размер файла: в байтах (число) или человекочитаемо (2M, 512K, 1.5GB).
multiplebooleanfalseПозволяет выбирать несколько файлов.
upload-button-titlestring'Выбрать файл(ы)'Текст на кнопке выбора (если не используется слот header).

Слоты (Slots)

НазваниеПараметрыОписание
header{ choose, clear, files, isDragging }Кастомная область выбора (триггер).
preview{ files, remove }Кастомная область предпросмотра выбранных файлов.
default-Содержимое под списком файлов.

События (Events)

НазваниеПараметрыОписание
selectvalueВызывается при выборе файлов.
clear-Вызывается при полной очистке списка.