В библиотеке Naive UI компоненты, связанные с
загрузкой данных или файлов, реализуются через
NUpload и связанные утилиты. Основной
принцип — предоставление пользователю понятного интерфейса загрузки и
управление состояниями: ожидание, прогресс, успешная загрузка и
ошибка.
NUploadNUpload является ключевым элементом для загрузки файлов.
Его использование включает настройку следующих свойств:
action — URL или функция для отправки
данных на сервер.headers — HTTP-заголовки для
запроса.data — дополнительные данные,
передаваемые вместе с файлом.multiple — возможность загрузки
нескольких файлов одновременно.accept — типы файлов, которые
разрешено загружать.max — ограничение на количество
файлов.before-upload — функция, вызываемая
перед загрузкой каждого файла, позволяет проверять его размер или
тип.on-progress — обработчик прогресса
загрузки.on-success — обработчик успешной
загрузки.on-error — обработчик ошибок.Пример базовой конфигурации:
import { NUpload, NButton } from 'naive-ui'
<NUpload
action="https://example.com/upload"
multiple
:on-progress="handleProgress"
:on-success="handleSuccess"
:on-error="handleError"
>
<NButton>Загрузить файл</NButton>
</NUpload>
1. Прогресс загрузки С помощью события
on-progress можно отслеживать прогресс
каждого файла. Аргументом является объект с полями percent
и file:
function handleProgress({ percent, file }) {
console.log(`${file.name}: ${percent}% загружено`)
}
2. Успешная загрузка Событие
on-success вызывается после завершения
загрузки и передачи ответа сервера:
function handleSuccess(response, file) {
console.log(`${file.name} успешно загружен`, response)
}
3. Ошибки загрузки Обработка ошибок через
on-error позволяет реагировать на проблемы
с сетью или сервером:
function handleError(error, file) {
console.error(`Ошибка при загрузке ${file.name}`, error)
}
NUpload позволяет полностью кастомизировать визуальный
интерфейс. Вместо стандартного NButton можно использовать
любой компонент, включая иконки, прогресс-бары или текстовые
уведомления:
<NUpload action="/upload">
<template #trigger>
<div class="custom-upload-trigger">
Нажмите, чтобы выбрать файл
</div>
</template>
</NUpload>
С помощью слота #trigger можно создать индивидуальный
дизайн, интегрируя его с текущей стилистикой приложения.
Фильтрация по типу осуществляется через свойство
accept, поддерживающее MIME-типы и расширения файлов:
<NUpload accept="image/png, image/jpeg">
<NButton>Загрузить изображения</NButton>
</NUpload>
Проверка размера и типа перед загрузкой реализуется
через before-upload:
function beforeUpload(file) {
if (file.size / 1024 / 1024 > 2) {
alert('Файл слишком большой. Максимум 2MB')
return false
}
return true
}
Возврат false прерывает загрузку.
Можно передавать в action не только строку URL, но и
функцию, возвращающую Promise. Это позволяет интегрировать
кастомные API или авторизацию:
function uploadFile(file) {
return fetch('/upload', {
method: 'POST',
body: file,
}).then(res => res.json())
}
<NUpload :action="uploadFile">
<NButton>Загрузить файл</NButton>
</NUpload>
Такая архитектура обеспечивает гибкость и возможность обработки токенов, заголовков и динамических данных перед отправкой.
Свойство multiple позволяет загружать несколько файлов
сразу. Для управления порядком или ограничением по количеству
используется max:
<NUpload multiple :max="5" action="/upload">
<NButton>Загрузить до 5 файлов</NButton>
</NUpload>
Каждый файл отслеживается отдельно, что позволяет строить собственные прогресс-бары для каждого элемента.
Naive UI предоставляет интеграцию с компонентами NProgress и NMessage для отображения прогресса и уведомлений:
import { NMessage } from 'naive-ui'
function handleSuccess(response, file) {
NMessage.success(`${file.name} успешно загружен`)
}
function handleError(error, file) {
NMessage.error(`Ошибка при загрузке ${file.name}`)
}
Таким образом, интерфейс становится интерактивным, информативным и безопасным.
Подход Naive UI к обработке загрузки файлов строится на:
on-progress,
on-success, on-error)before-upload,
accept, max)Эти возможности позволяют строить гибкие и безопасные интерфейсы загрузки файлов в современных веб-приложениях.