Drawer — это компонент интерфейса, предназначенный для отображения панели, выдвигающейся с краю экрана, обычно используемой для дополнительной информации, меню или настроек. В библиотеке Naive UI Drawer реализован с высокой гибкостью и простотой интеграции в проекты на Vue.js.
Для использования Drawer необходимо импортировать компонент из библиотеки:
import { NDrawer, NButton } from 'naive-ui'
import { ref } from 'vue'
export default {
setup() {
const showDrawer = ref(false)
return { showDrawer }
}
}
В шаблоне:
<n-button @click="showDrawer = true">Открыть Drawer</n-button>
<n-drawer v-model:show="showDrawer" title="Пример Drawer">
<p>Содержимое панели.</p>
</n-drawer>
Ключевые моменты:
v-model:show управляет видимостью панели.title задаёт заголовок Drawer.<n-drawer>.Drawer в Naive UI поддерживает четыре направления выдвижения через
проп placement:
<n-drawer v-model:show="showDrawer" placement="right" title="Правый Drawer">
Контент
</n-drawer>
<n-drawer v-model:show="showDrawer" placement="left" title="Левый Drawer">
Контент
</n-drawer>
<n-drawer v-model:show="showDrawer" placement="top" title="Верхний Drawer">
Контент
</n-drawer>
<n-drawer v-model:show="showDrawer" placement="bottom" title="Нижний Drawer">
Контент
</n-drawer>
Примечание: placement может принимать
значения 'left' | 'right' | 'top' | 'bottom'. По умолчанию
используется 'right'.
Размер панели управляется пропом width для вертикальных
Drawer и height для горизонтальных:
<n-drawer v-model:show="showDrawer" width="400px">
Контент
</n-drawer>
<n-drawer v-model:show="showDrawer" placement="bottom" height="300px">
Контент
</n-drawer>
Поддерживаются единицы измерения px, % и
vh/vw. Если размер не задан, используется стандартная
ширина 400px для вертикальных панелей и 300px для горизонтальных.
Drawer можно закрыть различными способами:
closable) По
умолчанию Drawer содержит крестик в верхнем углу.<n-drawer v-model:show="showDrawer" closable>
Контент
</n-drawer>
mask-closable) Проп mask-closable
отвечает за возможность закрытия кликом по затемнённой области:<n-drawer v-model:show="showDrawer" mask-closable>
Контент
</n-drawer>
v-model:show или метод, изменяя реактивное
состояние.Drawer в Naive UI поддерживает плавное выдвижение. Для изменения
стандартной анимации используются пропы show-mask и
кастомные классы через class:
<n-drawer
v-model:show="showDrawer"
transition-name="fade-slide-right"
show-mask
>
Контент
</n-drawer>
Можно подключить собственные CSS-анимации для создания уникального эффекта.
Drawer позволяет добавлять футер с кнопками подтверждения или отмены
через слот footer:
<n-drawer v-model:show="showDrawer" title="Пример с футером">
<p>Основной контент</p>
<template #footer>
<n-button @click="showDrawer = false">Отмена</n-button>
<n-button type="primary">Сохранить</n-button>
</template>
</n-drawer>
Использование слотов делает компонент максимально гибким для любых пользовательских сценариев.
Drawer идеально сочетается с формами, таблицами и настройками:
<n-drawer v-model:show="showDrawer" title="Настройки пользователя">
<n-form :model="userSettings">
<n-form-item label="Имя">
<n-input v-model:value="userSettings.name" />
</n-form-item>
<n-form-item label="Email">
<n-input v-model:value="userSettings.email" />
</n-form-item>
</n-form>
</n-drawer>
Это позволяет создавать интерактивные панели без необходимости отдельного маршрута или модального окна.
Drawer поддерживает динамическое содержимое. Можно загружать данные при открытии:
const userData = ref(null)
watch(showDrawer, async (val) => {
if (val) {
userData.value = await fetchUserData()
}
})
<n-drawer v-model:show="showDrawer" title="Профиль">
<p v-if="!userData">Загрузка...</p>
<div v-else>
<p>Имя: {{ userData.name }}</p>
<p>Email: {{ userData.email }}</p>
</div>
</n-drawer>
v-if
для Drawer, который редко отображается.destroy-on-close:
очищает содержимое при закрытии, освобождая память:<n-drawer v-model:show="showDrawer" destroy-on-close>
Контент
</n-drawer>
Drawer в Naive UI предоставляет мощный и гибкий инструмент для реализации выдвижных панелей любого типа, от простых меню до сложных интерактивных форм и настроек.