Skip to content
API 风格:

Меню навигации ​

Компонент навигации по странице. Поддерживает горизонтальную / вертикальную раскладку, вложенные подменю, свёрнутое состояние, аккордеон; работа с клавиатурой соответствует паттерну меню APG.

Вертикальная раскладка (встроенные подменю) ​

В вертикальном встроенном режиме поддерживается навигация с клавиатуры: после раскрытия подменю ↑/↓ перемещают фокус через границы «конечный пункт ↔ заголовок подменю ↔ пункт внутри панели» (Home/End — к первому и последнему), отключённые пункты и пункты внутри свёрнутых панелей пропускаются.

Вертикальная раскладка
vue
<script setup>
import { ref } from 'vue'
const active = ref('home')
const active2 = ref('settings2-basic')
</script>

<template>
  <!-- Вертикальная раскладка -->
  <LhMenu v-model="active">
    <LhMenuItem index="home">Главная</LhMenuItem>
    <LhSubMenu index="settings" title="Настройки">
      <LhMenuItem index="settings-basic">Основные настройки</LhMenuItem>
      <LhMenuItem index="settings-security">Настройки безопасности</LhMenuItem>
    </LhSubMenu>
    <LhMenuItem index="docs" disabled>Отключённый пункт</LhMenuItem>
  </LhMenu>
</template>
vue
<script>
export default {
  data() {
    return {
      active: 'home',
      active2: 'settings2-basic',
    }
  },
}
</script>

<template>
  <!-- Вертикальная раскладка -->
  <LhMenu v-model="active">
    <LhMenuItem index="home">Главная</LhMenuItem>
    <LhSubMenu index="settings" title="Настройки">
      <LhMenuItem index="settings-basic">Основные настройки</LhMenuItem>
      <LhMenuItem index="settings-security">Настройки безопасности</LhMenuItem>
    </LhSubMenu>
    <LhMenuItem index="docs" disabled>Отключённый пункт</LhMenuItem>
  </LhMenu>
</template>

Управление раскрытием ​

default-openeds — изначально раскрытые подменю; openeds (вместе с v-model:openeds) — контролируемое множество раскрытых; unique-opened — одновременно раскрыто только одно подменю. LhSubMenu также поддерживает disabled для полного отключения.

Управление раскрытием
  • vue
    <script setup>
    import { ref } from 'vue'
    const active2 = ref('settings2-basic')
    </script>
    
    <template>
      <!-- Управление раскрытием -->
      <LhMenu
        v-model="active2"
        :default-openeds="['settings2']"
        unique-opened
        style="max-width: 240px"
      >
        <LhSubMenu index="settings2" title="Настройки (раскрыто по умолчанию)">
          <LhMenuItem index="settings2-basic">Основные настройки</LhMenuItem>
          <LhMenuItem index="settings2-security">Настройки безопасности</LhMenuItem>
        </LhSubMenu>
        <LhSubMenu index="manage" title="Управление (отключено)" disabled>
          <LhMenuItem index="manage-users">Управление пользователями</LhMenuItem>
        </LhSubMenu>
        <LhMenuItem index="about2">О проекте</LhMenuItem>
      </LhMenu>
    </template>
    vue
    <script>
    export default {
      data() {
        return { active2: 'settings2-basic' }
      },
    }
    </script>
    
    <template>
      <!-- Управление раскрытием -->
      <LhMenu
        v-model="active2"
        :default-openeds="['settings2']"
        unique-opened
        style="max-width: 240px"
      >
        <LhSubMenu index="settings2" title="Настройки (раскрыто по умолчанию)">
          <LhMenuItem index="settings2-basic">Основные настройки</LhMenuItem>
          <LhMenuItem index="settings2-security">Настройки безопасности</LhMenuItem>
        </LhSubMenu>
        <LhSubMenu index="manage" title="Управление (отключено)" disabled>
          <LhMenuItem index="manage-users">Управление пользователями</LhMenuItem>
        </LhSubMenu>
        <LhMenuItem index="about2">О проекте</LhMenuItem>
      </LhMenu>
    </template>
    Контролируемое множество раскрытых
    vue
    <script setup lang="ts">
    import { ref } from 'vue'
    
    const active2 = ref('settings2-basic')
    </script>
    
    <template>
      <!-- Контролируемое множество раскрытых -->
      <LhMenu v-model="active2" :openeds="['settings2']">
        <LhSubMenu index="settings2" title="Настройки">
          <LhMenuItem index="settings2-basic">Основные настройки</LhMenuItem>
        </LhSubMenu>
      </LhMenu>
    </template>
    vue
    <script>
    export default {
      data() {
        return { active2: 'settings2-basic' }
      },
    }
    </script>
    
    <template>
      <!-- Контролируемое множество раскрытых -->
      <LhMenu v-model="active2" :openeds="['settings2']">
        <LhSubMenu index="settings2" title="Настройки">
          <LhMenuItem index="settings2-basic">Основные настройки</LhMenuItem>
        </LhSubMenu>
      </LhMenu>
    </template>

    Горизонтальная раскладка (выпадающие подменю) ​

    Горизонтальная раскладка
    vue
    <script setup lang="ts">
    import { ref } from 'vue'
    
    const active = ref('home')
    </script>
    
    <template>
      <!-- Горизонтальная раскладка -->
      <LhMenu v-model="active" mode="horizontal">
        <LhMenuItem index="home">Главная</LhMenuItem>
        <LhSubMenu index="settings" title="Настройки">
          <LhMenuItem index="settings-basic">Основные настройки</LhMenuItem>
        </LhSubMenu>
      </LhMenu>
    </template>
    vue
    <script>
    export default {
      data() {
        return { active: 'home' }
      },
    }
    </script>
    
    <template>
      <!-- Горизонтальная раскладка -->
      <LhMenu v-model="active" mode="horizontal">
        <LhMenuItem index="home">Главная</LhMenuItem>
        <LhSubMenu index="settings" title="Настройки">
          <LhMenuItem index="settings-basic">Основные настройки</LhMenuItem>
        </LhSubMenu>
      </LhMenu>
    </template>

    Свёрнутое состояние и группы ​

    Сворачивание + группы
    vue
    <script setup lang="ts">
    import { ref } from 'vue'
    
    const active = ref('home')
    </script>
    
    <template>
      <!-- Сворачивание + группы -->
      <LhMenu v-model="active" collapse>
        <LhMenuItemGroup title="Контент">
          <LhMenuItem index="home">Главная</LhMenuItem>
        </LhMenuItemGroup>
      </LhMenu>
    </template>
    vue
    <script>
    export default {
      data() {
        return { active: 'home' }
      },
    }
    </script>
    
    <template>
      <!-- Сворачивание + группы -->
      <LhMenu v-model="active" collapse>
        <LhMenuItemGroup title="Контент">
          <LhMenuItem index="home">Главная</LhMenuItem>
        </LhMenuItemGroup>
      </LhMenu>
    </template>

    API ​

    LhMenu Props ​

    СвойствоОписаниеТипПо умолчанию
    modelValueТекущий активный пункт (контролируемый v-model; при отсутствии поддерживается внутри компонента)string—
    modeРежим раскладки"horizontal" | "vertical"'vertical'
    collapseВ вертикальном режиме сворачивается до панели иконок (подменю превращаются во всплывающие панели)booleanfalse
    defaultOpenedsКлючи раскрытых по умолчанию подменю (неконтролируемые)string[]() => []
    openedsКлючи раскрытых подменю (контролируемые)string[]—
    uniqueOpenedАккордеон: одновременно раскрыто только одно подменюbooleanfalse
    sxСвойства быстрой разметки sxLhSxProps—

    Events ​

    СобытиеОписаниеПараметры обратного вызова
    update:modelValueСрабатывает при изменении активного пункта (v-model)(value: string)
    update:openedsСрабатывает при изменении множества раскрытых подменю (v-model:openeds)(value: string[])
    selectСрабатывает при выборе пункта меню(index: string, indexPath: string[])
    openСрабатывает при раскрытии подменю(index: string, indexPath: string[])
    closeСрабатывает при сворачивании подменю(index: string, indexPath: string[])

    LhMenuItem Props ​

    СвойствоОписаниеТипПо умолчанию
    indexУникальный идентификатор (обязательный)string—
    disabledОтключёнbooleanfalse
    sxСвойства быстрой разметки sxLhSxProps—

    Событие: click(index); слот: default.

    LhSubMenu Props ​

    СвойствоОписаниеТипПо умолчанию
    indexУникальный идентификатор (обязательный)string—
    titleЗаголовок (можно также использовать слот title)string—
    disabledОтключёнbooleanfalse
    sxСвойства быстрой разметки sxLhSxProps—

    Событие: select(index, indexPath) (всплывает); слоты: title, default (допускает дальнейшую вложенность LhSubMenu).

    LhMenuItemGroup Props ​

    СвойствоОписаниеТипПо умолчанию
    titleЗаголовок группы (можно также использовать слот title)string—
    sxСвойства быстрой разметки sxLhSxProps—

    Слоты: title, default.

    Доступность ​

    Определения типов ​

    Структуры TypeScript, экспортируемые этим компонентом (автоматически извлечены из packages/components/menu/src/types.ts и исходников @lh-ui/share/core/*; нажмите на каждый пункт, чтобы развернуть полное определение; описания свойств см. в таблице Props выше):

    LhMenuProps
    ts
    /** Props меню */
    export interface LhMenuProps {
      /** Текущий активный пункт (контролируемый v-model; при отсутствии поддерживается внутри компонента) */
      modelValue?: string
      /** Режим раскладки */
      mode?: LhMenuMode
      /** В вертикальном режиме сворачивается до панели иконок (подменю превращаются во всплывающие панели) */
      collapse?: boolean
      /** Ключи раскрытых по умолчанию подменю (неконтролируемые) */
      defaultOpeneds?: string[]
      /** Ключи раскрытых подменю (контролируемые) */
      openeds?: string[]
      /** Аккордеон: одновременно раскрыто только одно подменю */
      uniqueOpened?: boolean
      /** Свойства быстрой разметки sx */
      sx?: LhSxProps
    }
    LhMenuItemProps
    ts
    /** Props конечного пункта */
    export interface LhMenuItemProps {
      /** Уникальный идентификатор (обязательный) */
      index: string
      disabled?: boolean
      /** Свойства быстрой разметки sx */
      sx?: LhSxProps
    }
    LhSubMenuProps
    ts
    /** Props подменю (допускает рекурсивную вложенность) */
    export interface LhSubMenuProps {
      /** Уникальный идентификатор (обязательный) */
      index: string
      /** Заголовок (можно также использовать слот title) */
      title?: string
      disabled?: boolean
      /** Свойства быстрой разметки sx */
      sx?: LhSxProps
    }
    LhMenuItemGroupProps
    ts
    /** Props группы */
    export interface LhMenuItemGroupProps {
      /** Заголовок группы (можно также использовать слот title) */
      title?: string
      /** Свойства быстрой разметки sx */
      sx?: LhSxProps
    }
    LhMenuMode (из @lh-ui/share/core/menu)
    ts
    /** Режим раскладки меню */
    export type LhMenuMode = 'horizontal' | 'vertical'