Библиотека Noty предоставляет гибкие средства для отображения уведомлений, включая индикаторы прогресса. По умолчанию прогресс может обновляться автоматически, но при необходимости его можно контролировать вручную, что особенно полезно для отображения состояния длительных операций, таких как загрузка файлов или выполнение сложных вычислений.
Для ручного управления прогрессом необходимо создать уведомление с
опцией progressBar: true и включить
closeWith: [], чтобы пользователь не мог закрыть
уведомление до завершения операции:
let n = new Noty({
text: 'Загрузка файла: 0%',
type: 'info',
timeout: false,
progressBar: true,
closeWith: [],
}).show();
timeout: false предотвращает автоматическое закрытие
уведомления.progressBar: true активирует визуальный индикатор
прогресса.closeWith: [] запрещает закрытие пользователем.После создания уведомления прогресс можно обновлять с помощью метода
setText и свойства progress уведомления. Для
точного контроля используется объект Noty и его внутренний
метод barDom, отвечающий за DOM-элемент прогресс-бара.
function updateProgress(notyInstance, percent) {
notyInstance.setText(`Загрузка файла: ${percent}%`);
notyInstance.barDom.style.width = `${percent}%`;
}
percent — значение прогресса в процентах (0–100).setText обновляет текст уведомления.barDom.style.width напрямую изменяет ширину
прогресс-бара.Noty позволяет управлять прогрессом и создавать плавную анимацию
через setInterval или requestAnimationFrame.
Пример постепенного обновления:
let progress = 0;
let interval = setInterval(() => {
if (progress >= 100) {
clearInterval(interval);
n.close();
} else {
progress += 5;
updateProgress(n, progress);
}
}, 200);
close().Noty поддерживает события жизненного цикла уведомлений. Для ручного прогресса полезны следующие:
onShow — срабатывает при показе уведомления, можно
инициализировать прогресс.onClose — позволяет очистить интервалы или завершить
асинхронные процессы.Пример с синхронизацией с асинхронной загрузкой:
let n = new Noty({
text: 'Загрузка...',
type: 'info',
timeout: false,
progressBar: true,
closeWith: [],
callbacks: {
onShow: () => startUpload(n),
onClose: () => clearUpload()
}
}).show();
function startUpload(notyInstance) {
let progress = 0;
let interval = setInterval(() => {
progress += 10;
updateProgress(notyInstance, progress);
if (progress >= 100) clearInterval(interval);
}, 300);
}
function clearUpload() {
console.log('Процесс загрузки завершен');
}
При ручном прогрессе полезно менять не только ширину индикатора, но и текст или цвет уведомления:
if (progress < 50) {
n.setType('info').setText(`Загрузка: ${progress}%`);
} else if (progress < 100) {
n.setType('warning').setText(`Идёт обработка: ${progress}%`);
} else {
n.setType('success').setText('Загрузка завершена');
}
setType позволяет менять цветовую схему уведомления
(info, success, warning,
error).setText динамически отображает текущее состояние.Можно интегрировать ручное обновление прогресса с
async/await для отображения состояния реальных
процессов:
async function simulateUpload(notyInstance) {
for (let i = 1; i <= 10; i++) {
await new Promise(resolve => setTimeout(resolve, 300));
updateProgress(notyInstance, i * 10);
}
notyInstance.close();
}
simulateUpload(n);
Эти приёмы обеспечивают полный контроль над прогресс-барами в Noty, позволяя создавать сложные визуальные уведомления с динамическим обновлением текста, типа и состояния прогресса.