Меню
Компонент ui.system.menu представляет собой выпадающее меню (попап), которое предназначено для отображения списка действий: настройки, дополнительные опции или контекстные команды. Меню может содержать пункты с иконками, подзаголовками, счетчиками, блокировкой, подменю, секциями и расширенным заголовком. Компонент поддерживает использование как в чистом JavaScript, так и во Vue 3 через расширение.
Подключение
import { Menu, MenuItemDesign } from 'ui.system.menu';
const menu = new Menu({
bindElement: document.getElementById('menu-button'),
items: [
{
title: 'Открыть',
onClick: () => console.log('Открыто'),
},
{
title: 'Удалить',
design: MenuItemDesign.Alert,
onClick: () => console.log('Удалено'),
},
],
});
menu.show();
Использование в Vue 3
Компонент меню можно использовать в Vue 3 приложениях с помощью расширения ui.vue3.components.menu. Доступен компонент BMenu и тип MenuOptions.
import { BMenu, type MenuOptions } from 'ui.vue3.components.menu';
// @vue/component
export const MyComponent = {
components: {
BMenu,
},
data() {
return {
isMenuShown: false,
};
},
computed: {
menuOptions() {
return {
bindElement: this.$refs.button,
items: [
{
title: 'Пункт 1',
onClick: () => {
console.log('Выбран пункт 1');
},
},
{
title: 'Подменю',
subMenu: {
items: [
{
title: 'Вложенная опция',
onClick: () => {
console.log('Подменю выбрано');
},
},
],
},
},
],
};
},
},
template: `
<button ref="button" @click="isMenuShown = true">
Открыть меню
</button>
<BMenu v-if="isMenuShown" :options="menuOptions" @close="isMenuShown = false"/>
`,
};
Параметры компонента
MenuOptions — основные параметры меню, наследуют PopupOptions из main.popup и расширяют их специфичными полями.
Параметртип | Описание |
|---|---|
sectionsMenuSectionOptions[] |
Массив секций, по которым группируются пункты меню. Список секций, нужен для отделения групп пунктов друг от друга. Все элементы без секции отрисовываются в начале меню. Секции отделяются разделителем, у которого может быть заголовок. |
itemsMenuItemOptions[] |
Массив пунктов меню. Каждый пункт может иметь подменю, иконку, счетчик и так далее. |
richHeaderRichHeader |
Расширенный заголовок меню с иконкой, названием, подзаголовком и кнопкой. |
closeOnItemClickboolean |
Закрывать ли меню при клике на пункт, если у пункта нет подменю. |
MenuItemOptions — параметры отдельного пункта меню.
Параметртип | Описание |
|---|---|
idstring |
Уникальный идентификатор пункта. |
sectionCodestring |
Код секции, к которой принадлежит пункт. |
designstring |
Стилевое оформление пункта. |
onClickFunction |
Функция, вызываемая при клике на пункт. |
titlestring |
Основной текст пункта. |
subtitlestring |
Дополнительный текст под заголовком. |
badgeText{title: string, color: string} |
Текст бейджа справа от заголовка. |
isSelectedboolean |
Отображать ли галочку выбора слева. |
iconstring |
Код иконки слева, из иконок ui.icon-set. |
svgSVGElement |
Кастомный SVG-элемент вместо иконки. |
extraIconobject |
Иконка-действие справа, например, звезда. |
counterCounterOptions |
Счетчик справа, из ui.cnt. |
subMenuMenuOptions[] |
Подменю, отображается при наведении. |
isLockedboolean |
Показывать значок замка слева. |
closeOnSubItemClickboolean |
Закрывать ли основное меню при клике во вложенном меню. |
MenuSectionOptions — параметры секции меню.
Параметртип | Описание |
|---|---|
codestring |
Уникальный код секции, используется для группировки пунктов. |
titlestring |
Заголовок секции, отображается над группой пунктов. Если передать пустым, то секция будет отделена только разделительной чертой. |
design'default' | 'accent' |
Стиль оформления секции. |
RichHeader — параметры богатого заголовка.
Параметртип | Описание |
|---|---|
design'default' | 'copilot' |
Дизайн заголовка. |
titlestring |
Текст заголовка. |
subtitlestring |
Текст подзаголовка. |
iconstring |
Иконка из ui.icon-set.api.core. |
onClickfunction |
Функция, вызываемая при клике на заголовок. |
Методы компонента
Класс Menu предоставляет следующие публичные методы:
| Метод | Описание | Параметры | Возвращаемое значение |
|---|---|---|---|
show(bindElement: HTMLElement): void |
Отображает меню. Если передан bindElement, привязывает попап к нему. |
bindElement — DOM-элемент, к которому привязывается меню |
— |
updateItems(itemsOptions: MenuItemOptions[]): void |
Обновляет список пунктов меню. Сохраняет состояние открытых подменю, если это возможно. | itemsOptions — новый массив пунктов |
— |
close(): void |
Закрывает меню программно. | — | — |
destroy(): void |
Уничтожает меню, удаляет все обработчики и подменю. Вызывается автоматически при закрытии, если установлен closeByEsc. |
— | — |
getOptions(): MenuOptions |
Возвращает текущие параметры меню. | — | MenuOptions |
getPopup(): Popup |
Возвращает внутренний экземпляр Popup из main.popup. |
— | Popup |
getPopupContainer(): HTMLElement |
Возвращает контейнер попапа (DOM-элемент). | — | HTMLElement |
Примеры использования
Меню с секциями и расширенным заголовком
new BX.UI.System.Menu({
richHeader: {
design: 'copilot',
title: 'AI Assistant',
subtitle: 'Готов помочь',
icon: 'main-copilot-ai',
onClick: () => console.log('Header clicked')
},
sections: [
{ code: 'actions', title: 'Действия', design: BX.UI.System.MenuSectionDesign.Accent
},
{ code: 'settings', title: 'Настройки' }
],
items: [
{
title: 'Создать',
sectionCode: 'actions',
icon: ‘outline-add-l',
},
{
title: 'Редактировать',
sectionCode: ‘actions',
},
{
title: 'Темная тема',
sectionCode: 'settings',
isSelected: true,
},
],
}).show();
Меню с подменю
new BX.UI.System.Menu({
items: [
{
title: 'Экспорт',
subMenu: {
items: [
{ title: 'PDF', onClick: () => console.log('PDF') },
{ title: 'Excel', onClick: () => console.log('Excel') },
],
},
},
{
title: 'Удалить',
design: BX.UI.System.MenuItemDesign.Alert,
onClick: () => confirm(‘Удалить?'),
},
],
}).show();