Интеграция библиотеки Noty в приложение на Vue.js начинается с установки через пакетный менеджер:
npm install noty
Далее необходимо импортировать библиотеку и стили в проект:
import Noty from 'noty';
import 'noty/lib/noty.css';
import 'noty/lib/themes/mint.css';
Стили темы можно заменить на любую доступную (relax,
metroui, sunset и др.).
В Vue-приложениях удобно вынести работу с уведомлениями в отдельный модуль. Это избавляет от дублирования кода и упрощает управление уведомлениями.
// services/noty.js
import Noty from 'noty';
export function notify(options) {
return new Noty({
type: 'success',
layout: 'topRight',
timeout: 3000,
theme: 'mint',
...options
}).show();
}
Использование:
import { notify } from '@/services/noty';
notify({ text: 'Данные успешно сохранены' });
Для удобного доступа к Noty из любого компонента можно добавить его в глобальные свойства приложения.
import { createApp } from 'vue';
import App from './App.vue';
import Noty from 'noty';
const app = createApp(App);
app.config.globalProperties.$noty = (options) => {
return new Noty({
layout: 'topRight',
timeout: 3000,
theme: 'mint',
...options
}).show();
};
app.mount('#app');
Использование в компоненте:
this.$noty({ text: 'Уведомление из компонента', type: 'info' });
Vue.prototype.$noty = function(options) {
return new Noty({
layout: 'topRight',
timeout: 3000,
theme: 'mint',
...options
}).show();
};
В проектах на Vue 3 с Composition API удобно создавать composable-функцию:
// composables/useNoty.js
import Noty from 'noty';
export function useNoty() {
const show = (options) => {
return new Noty({
layout: 'topRight',
timeout: 3000,
theme: 'mint',
...options
}).show();
};
return { show };
}
Использование:
import { useNoty } from '@/composables/useNoty';
export default {
setup() {
const { show } = useNoty();
show({ text: 'Сообщение через Composition API', type: 'success' });
}
};
Noty часто используется для отображения уведомлений при изменении состояния приложения — успешные операции, ошибки, предупреждения.
import axios from 'axios';
import { notify } from '@/services/noty';
async function saveData(data) {
try {
await axios.post('/api/save', data);
notify({ text: 'Сохранение выполнено', type: 'success' });
} catch (e) {
notify({ text: 'Ошибка при сохранении', type: 'error' });
}
}
При использовании централизованного хранилища удобно вызывать уведомления внутри действий.
actions: {
async fetchData({ commit }) {
try {
const data = await fetch('/api/data').then(r => r.json());
commit('setData', data);
notify({ text: 'Данные загружены', type: 'success' });
} catch {
notify({ text: 'Ошибка загрузки', type: 'error' });
}
}
}
import { defineStore } from 'pinia';
import { notify } from '@/services/noty';
export const useStore = defineStore('main', {
actions: {
async load() {
try {
// загрузка данных
notify({ text: 'Успешно', type: 'success' });
} catch {
notify({ text: 'Ошибка', type: 'error' });
}
}
}
});
Noty предоставляет широкие возможности настройки:
notify({
text: 'Подтвердите действие',
type: 'warning',
timeout: false,
buttons: [
Noty.button('Да', 'btn btn-success', function () {
console.log('Подтверждено');
this.close();
}),
Noty.button('Нет', 'btn btn-danger', function () {
this.close();
})
]
});
Для предотвращения перегрузки интерфейса можно ограничить количество одновременно отображаемых уведомлений:
Noty.setMaxVisible(3);
Или использовать очередь:
new Noty({
text: 'Сообщение в очереди',
queue: 'customQueue'
}).show();
В SPA-приложениях важно очищать уведомления при переходе между страницами:
import Noty from 'noty';
import router from './router';
router.afterEach(() => {
Noty.closeAll();
});
Noty поддерживает кастомные CSS-анимации:
new Noty({
text: 'Анимированное уведомление',
animation: {
open: 'animated bounceInRight',
close: 'animated bounceOutRight'
}
}).show();
Требуется подключение библиотеки анимаций, например animate.css.
1. Уведомления об ошибках формы
if (!email) {
notify({ text: 'Email обязателен', type: 'error' });
}
2. Глобальный обработчик ошибок
window.addEventListener('error', () => {
notify({ text: 'Произошла ошибка', type: 'error' });
});
3. Уведомления после маршрутизации
router.afterEach((to) => {
if (to.meta.successMessage) {
notify({ text: to.meta.successMessage, type: 'success' });
}
});
При использовании серверного рендеринга (например, Nuxt) необходимо учитывать, что Noty работает только в браузере:
if (typeof window !== 'undefined') {
notify({ text: 'Клиентское уведомление' });
}
success, error,
warning, info) для UXNoty можно обернуть в полноценный Vue-плагин:
export default {
install(app) {
app.config.globalProperties.$notify = (options) => {
return new Noty({
layout: 'topRight',
timeout: 3000,
theme: 'mint',
...options
}).show();
};
}
};
Подключение:
import NotyPlugin from './plugins/noty';
app.use(NotyPlugin);
Распространённые проблемы:
window is undefinedДля диагностики полезно временно отключать timeout:
notify({ text: 'Отладка', timeout: false });