DialogProvider в Naive UI — это
компонент-контейнер, обеспечивающий централизованное управление
модальными окнами и диалогами. Для его использования сначала необходимо
импортировать и подключить его к корневому компоненту приложения:
import { createApp, h } from 'vue';
import { DialogProvider, NButton } from 'naive-ui';
import App from './App.vue';
const app = createApp({
render: () => h(DialogProvider, null, { default: () => h(App) })
});
app.mount('#app');
Ключевые моменты:
DialogProvider должен оборачивать весь участок
приложения, где будут использоваться модальные окна.useDialog.Для управления диалогами применяется хук useDialog. Он
возвращает объект с методами dialog, info,
warning, error, success для
создания различных типов модальных окон. Пример базового
использования:
import { useDialog, NButton } from 'naive-ui';
import { defineComponent } from 'vue';
export default defineComponent({
setup() {
const dialog = useDialog();
const showDialog = () => {
dialog.info({
title: 'Информация',
content: 'Это информационный диалог',
positiveText: 'ОК'
});
};
return { showDialog };
},
template: `
<n-button @click="showDialog">Показать диалог</n-button>
`
});
Особенности:
info, success,
warning, error автоматически создают диалоги с
соответствующим стилем.dialog позволяет полностью контролировать
контент, кнопки и события закрытия.Метод dialog принимает объект настроек с большим
количеством параметров, позволяя полностью кастомизировать
поведение:
dialog.dialog({
title: 'Подтверждение',
content: 'Вы уверены, что хотите удалить элемент?',
positiveText: 'Да',
negativeText: 'Нет',
onPositiveClick: () => {
console.log('Подтверждено');
},
onNegativeClick: () => {
console.log('Отменено');
},
closable: false,
maskClosable: true
});
Ключевые параметры:
title – заголовок диалога.content – основной контент, может быть строкой, HTML
или компонентом Vue.positiveText и negativeText – текст
кнопок.onPositiveClick и onNegativeClick –
обработчики кликов.closable – возможность закрытия кнопкой
X.maskClosable – закрытие при клике на фон.Диалоги поддерживают асинхронные действия. Можно использовать
async/await для выполнения логики перед закрытием
диалога:
dialog.dialog({
title: 'Загрузка данных',
content: 'Подождите, идет процесс...',
positiveText: 'Начать',
async onPositiveClick() {
await fetchData();
dialog.success({ title: 'Готово', content: 'Данные успешно загружены' });
}
});
Примечания:
Promise.DialogProvider позволяет использовать Vue-компоненты
внутри диалогов для сложного контента:
import CustomForm from './CustomForm.vue';
dialog.dialog({
title: 'Форма ввода',
content: () => h(CustomForm, { defaultValue: 'Тест' }),
positiveText: 'Отправить',
onPositiveClick: (dialogInst) => {
console.log('Данные отправлены');
dialogInst.destroy();
}
});
Особенности:
content возвращает виртуальный DOM или
компонент Vue.destroy() закрывает диалог программно.DialogProvider поддерживает несколько открытых диалогов одновременно.
Каждый вызов dialog возвращает объект с методами
управления:
const dialogInstance = dialog.dialog({
title: 'Диалог 1',
content: 'Содержимое 1',
positiveText: 'ОК'
});
dialogInstance.destroy(); // Закрытие конкретного диалога
Методы объекта диалога:
destroy() – закрывает диалог.update(props) – динамически обновляет свойства
диалога.render() – перерендер компонента, если изменился
контент.Диалоги наследуют темы Naive UI, но могут быть переопределены через
параметры style и class:
dialog.dialog({
title: 'Стилизованный диалог',
content: 'Контент с кастомной темой',
positiveText: 'ОК',
style: { width: '400px', backgroundColor: '#f5f5f5' },
class: 'custom-dialog'
});
style – инлайн стили.class – CSS-классы для точечной стилизации.DialogProvider в сочетании с useDialog
предоставляет:
Эти возможности делают DialogProvider базовым
инструментом для реализации любых пользовательских интерфейсов с
диалогами в приложениях на Vue.js с использованием
Naive UI.