Компонент Drawer в Element Plus используется для создания боковых панелей, которые выезжают поверх основного содержимого. Он позволяет реализовать интерфейсы с дополнительной информацией, настройками или формами, не перегружая основной экран. Drawer может появляться с любой стороны окна: слева, справа, сверху или снизу, с возможностью настраивать размеры и поведение закрытия.
Основные свойства:
model-value – управляет видимостью панели
(true/false).title – заголовок панели.size – ширина или высота панели (может быть задана в px
или %).direction – направление появления: ltr (по
умолчанию слева направо), rtl, ttb (сверху
вниз), btt (снизу вверх).with-header – отображение заголовка панели.destroy-on-close – удалять содержимое после закрытия
(экономит память при сложных компонентах).modal – затемнение заднего фона (по умолчанию
true).lock-scroll – блокировка прокрутки основного контента
при открытой панели.<template>
<el-button @click="drawerVisible = true">Открыть панель</el-button>
<el-drawer
v-model="drawerVisible"
title="Настройки"
size="30%"
direction="rtl"
>
<p>Содержимое боковой панели</p>
<el-button @click="drawerVisible = false">Закрыть</el-button>
</el-drawer>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const drawerVisible = ref(false)
return { drawerVisible }
}
}
</script>
В этом примере кнопка управляет состоянием видимости панели через
v-model. Панель выезжает справа, занимает 30% ширины экрана
и имеет заголовок «Настройки».
Drawer поддерживает динамическую настройку размеров:
size="50%" – пол экрана.size="400px" – фиксированная ширина.<el-drawer
v-model="drawerVisible"
:size="drawerWidth"
>
<p>Контент адаптивной панели</p>
</el-drawer>
<script>
const drawerWidth = ref(window.innerWidth > 1200 ? '30%' : '80%')
window.addEventListener('resize', () => {
drawerWidth.value = window.innerWidth > 1200 ? '30%' : '80%'
})
</script>
Drawer предоставляет несколько полезных событий для управления жизненным циклом панели:
open – срабатывает при открытии панели.opened – после завершения анимации открытия.close – при попытке закрытия панели (можно
предотвратить).closed – после полной анимации закрытия.Пример использования события close для проверки условий
перед закрытием:
<el-drawer
v-model="drawerVisible"
title="Проверка перед закрытием"
@close="handleClose"
>
<p>Форма или данные</p>
</el-drawer>
<script>
const drawerVisible = ref(false)
function handleClose(done) {
if(confirm('Вы действительно хотите закрыть панель?')) {
done()
}
}
</script>
Drawer хорошо сочетается с другими компонентами Element Plus: формами, таблицами, вкладками. Пример с формой внутри боковой панели:
<el-drawer v-model="drawerVisible" title="Форма пользователя">
<el-form :model="form">
<el-form-item label="Имя">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="Email">
<el-input v-model="form.email"></el-input>
</el-form-item>
<el-button type="primary" @click="submitForm">Сохранить</el-button>
</el-form>
</el-drawer>
<script>
import { reactive, ref } from 'vue'
const drawerVisible = ref(false)
const form = reactive({ name: '', email: '' })
function submitForm() {
console.log('Данные формы:', form)
drawerVisible.value = false
}
</script>
Drawer поддерживает кастомизацию через CSS и слоты. Например, можно изменить цвет заголовка или добавить иконку закрытия:
<el-drawer
v-model="drawerVisible"
title="Панель с иконкой"
custom-class="custom-drawer"
>
<template #header>
<span>Особый заголовок</span>
<el-button @click="drawerVisible = false" icon="el-icon-close"></el-button>
</template>
<p>Контент панели</p>
</el-drawer>
<style>
.custom-drawer .el-drawer__header {
background-color: #f0f0f0;
color: #333;
font-weight: bold;
}
</style>
В интерфейсах, где необходимо открывать несколько уровней боковых
панелей, Drawer позволяет использовать вложенные панели, каждая со своим
состоянием v-model. Важно правильно управлять
z-index и размерами, чтобы панели не перекрывали критически
важные элементы интерфейса.
<el-drawer v-model="outerDrawer">
<p>Внешняя панель</p>
<el-button @click="innerDrawer = true">Открыть вложенную панель</el-button>
<el-drawer v-model="innerDrawer" size="50%">
<p>Вложенная панель</p>
</el-drawer>
</el-drawer>
destroy-on-close для сложных форм, чтобы
сбрасывать состояние при закрытии.lock-scroll.teleport для корректного рендеринга в
определённой области DOM.direction в зависимости от UX — для
настроек обычно справа, для навигации слева.Drawer в Element Plus является мощным инструментом для построения динамичных интерфейсов с выезжающими панелями, позволяя гибко управлять содержимым, анимациями и взаимодействием с пользователем.