КРЕАТИВНЫЕ САЙТЫ И ПРИЛОЖЕНИЯ,
КАЧЕСТВЕННЫЕ WEB-УСЛУГИ
phone

SwMenu

Компонент SwMenu представляет собой
динамическое меню, которое генерируется на основе конфигурационного объекта.

SwMenu

Компонент SwMenu представляет собой динамическое меню, которое генерируется на основе конфигурационного объекта или массива. Поддерживает рендеринг любых компонентов с возможностью настройки слотов и свойств.

Свойства / Properties

ИмяТипПо умолчаниюЗначения/Описание
menuItems`Object \Array`requiredКонфигурация меню. Объект или массив объектов с компонентами и их настройками.
classString''Добавляет пользовательский CSS-класс к компоненту.

Модель / Model

model - массив булевых значений для двусторонней привязки (v-model) с компонентами первого уровня.

События / Events

click - событие клика по компоненту. Параметры: { index, componentName, event, value } change - событие изменения значения компонента. Параметры: { index, componentName, event?, value }

Формат конфигурации menuItems

Вариант 1: Объект

{
  'SwButton': {
    label: 'Кнопка',
    type: 'primary',
    slot: 'Текст кнопки'
  },
  'SwSwitch': [
    { 
      label: 'Переключатель 1',
      on: 'Вкл',
      off: 'Выкл'
    },
    { 
      label: 'Переключатель 2',
      checkbox: true
    }
  ]
}

Вариант 2: Массив

[
  { 
    'SwButton': { 
      label: 'Кнопка 1', 
      type: 'success' 
    } 
  },
  { 
    'SwInput': { 
      name: 'input1',
      placeholder: 'Введите текст',
      before: 'search'
    } 
  }
]

Использование слотов

Для добавления контента в слоты компонентов используйте свойство slot:

{
  'SwDropdown': {
    trigger: 'click',
    'slot.dropdown': {
      'SwDropdownItem': {
        slot: 'Пункт меню'
      }
    }
  }
}

Или используйте префикс slot. для именованных слотов:

{
  'SwSection': {
    name: 'Секция',
    slot: 'Содержимое секции',
    'slot.footer': {
      'SwButton': {
        label: 'Сохранить',
        type: 'primary'
      }
    }
  }
}

Особенности реализации

  • Автоматический рендеринг компонентов на основе конфигурации
  • Поддержка вложенных компонентов через слоты
  • Двусторонняя привязка (v-model) для компонентов первого уровня
  • Эмит событий click и change для всех компонентов
  • Рекурсивная обработка конфигурации любой сложности
  • Поддержка как объектного, так и массивного формата menuItems

Пример использования / Example Usage

Базовый пример с объектом:

<script setup>
import { ref } from 'vue'

const menuState = ref([false, false])

const menuConfig = {
  'SwButton': {
    label: 'Нажми меня',
    type: 'primary',
    prefix: 'star'
  },
  'SwSwitch': [
    { 
      label: 'Уведомления',
      on: 'Вкл',
      off: 'Выкл'
    },
    { 
      label: 'Звук',
      checkbox: true
    }
  ]
}

const handleClick = (data) => {
  console.log('Clicked:', data)
}

const handleChange = (data) => {
  console.log('Changed:', data)
}
</script>

<sw-menu 
  :menu-items="menuConfig" 
  v-model="menuState"
  @click="handleClick"
  @change="handleChange"
/>

Пример с массивом:

<script setup>
import { ref } from 'vue'

const menuItems = [
  { 
    'SwButton': { 
      label: 'Главная', 
      type: 'info',
      link: true,
      href: '/'
    } 
  },
  { 
    'SwButton': { 
      label: 'О нас', 
      type: 'info',
      link: true,
      href: '/about'
    } 
  },
  { 
    'SwInput': { 
      name: 'search',
      placeholder: 'Поиск...',
      before: 'search',
      size: 'small'
    } 
  }
]
</script>

<sw-menu 
  :menu-items="menuItems"
  class="custom-menu"
/>

Пример с вложенными компонентами:

<script setup>
import { ref } from 'vue'

const dropdownMenu = {
  'SwDropdown': {
    trigger: 'hover',
    placement: 'bottom-left',
    slot: {
      'SwButton': {
        label: 'Меню',
        type: 'primary',
        postfix: 'arrow-down'
      }
    },
    'slot.dropdown': [
      {
        'SwDropdownItem': {
          iconBefore: 'user',
          slot: 'Профиль'
        }
      },
      {
        'SwDropdownItem': {
          iconBefore: 'settings',
          slot: 'Настройки'
        }
      }
    ]
  }
}
</script>

<sw-menu :menu-items="dropdownMenu" />

Пример с использованием слотов:

<script setup>
import { h } from 'vue'
import { components } from '@studio-west/component-sw'

const complexMenu = {
  'SwSection': {
    name: 'Панель управления',
    iconAfter: 'chevron-down',
    slot: 'Основное содержимое секции',
    'slot.footer': {
      'SwButtonGroup': {
        radio: true,
        slot: [
          {
            'SwButton': {
              label: 'Опция 1',
              type: 'primary'
            }
          },
          {
            'SwButton': {
              label: 'Опция 2'
            }
          }
        ]
      }
    }
  }
}
</script>

<sw-menu :menu-items="complexMenu" />