Navigation

Menu

Componente menu versatile in modalità statica o popup. Supporta submenu, separatori, badge, router-link, link esterni e slot per personalizzazione completa del rendering.

Import

import { Menu } from '@pzeta/vue-components'
import type { MenuItem } from '@pzeta/vue-components'

Struttura MenuItem

L'interfaccia MenuItem è il blocco fondamentale di tutti i componenti navigation.

CampoTipoDescrizione
labelstringTesto dell'elemento
iconstringClasse CSS dell'icona (es. 'pi pi-home')
tostring | RouteLocationDestinazione router-link (Vue Router)
urlstringURL link esterno
itemsMenuItem[]Sotto-elementi per menu annidati
command(event: MenuItemCommandEvent) => voidCallback eseguita al click. Una voce senza url né to non naviga: dalla 1.22.0 il click non aggiunge più # all'URL (in un microfrontend, quello della shell)
disabledbooleanDisabilita l'elemento
visiblebooleanNasconde l'elemento se false
targetstringAttributo target del link (es. '_blank')
itemKeystringChiave univoca per Vue (alternativa a key riservato)
classstringClasse CSS personalizzata
styleRecord<string, string | number>Stili inline
separatorbooleanRende l'elemento un separatore visivo
badgestring | (() => string | number)Badge statico o dinamico (funzione per valore reattivo)
badgeClassstringClasse CSS del badge
tooltipstringTesto tooltip
tooltipOptionsRecord<string, unknown>Opzioni tooltip
descriptionstringTesto descrittivo secondario
ordernumberOrdinamento dell'elemento

Esempio Base

Props

PropTipoDefaultDescrizione
modelMenuItem[][]Array di elementi del menu
popupbooleanfalseModalità popup: il menu è nascosto e si apre tramite toggle()
sizeSize'medium'Dimensione degli elementi (small, medium, large)
appendTo'body' | 'self' | string | HTMLElement'body'Elemento a cui appendere il popup
autoZIndexbooleantrueGestione automatica dello z-index
baseZIndexnumber0Valore base z-index
exactbooleantrueMatch esatto per router-link-active
tabindexnumber | string0Indice di tabulazione
ariaLabelstringundefinedLabel ARIA del menu
ariaLabelledbystringundefinedID dell'elemento che fornisce il label ARIA

Emits

EventoPayloadDescrizione
show—Emesso quando il popup diventa visibile
hide—Emesso quando il popup viene nascosto
focusEventEmesso quando il menu riceve il focus
blurEventEmesso quando il menu perde il focus

Slot

SlotScopeDescrizione
start—Contenuto aggiuntivo prima degli elementi del menu
end—Contenuto aggiuntivo dopo gli elementi del menu
item{ item: MenuItem; label: string; props: Record<string, unknown> }Template personalizzato per ogni elemento
itemicon{ item: MenuItem; class: string }Template personalizzato per l'icona dell'elemento
submenuicon{ active: boolean }Template personalizzato per l'icona del submenu

Esempi

Modalità Popup

Con slot start/end (profilo utente)

Template item personalizzato

<script setup lang="ts">
import type { MenuItem } from '@pzeta/vue-components'

const items: MenuItem[] = [
  { label: 'Documentazione', icon: 'pi pi-book', url: 'https://docs.example.com', target: '_blank' },
  { label: 'GitHub', icon: 'pi pi-github', url: 'https://github.com', target: '_blank' },
]
</script>

Metodi esposti (ref)

MetodoFirmaDescrizione
toggle(event: Event) => voidAlterna visibilità del popup
show(event?: Event) => voidMostra il popup ancorato all'elemento trigger
hide() => voidNasconde il popup

Accessibilità

  • Usa role="menu" con aria-label configurabile.
  • La chiusura del popup avviene al click fuori dall'area del menu.
  • Gli elementi con url e target="_blank" ricevono automaticamente rel="noopener noreferrer".
  • Il RouterLink per le voci con to è quello che vue-router registra nell'app, risolto una volta sola. In un'app senza vue-router non compare più il warning «Failed to resolve component: RouterLink» a ogni render, anche senza voci con to; in quel caso le voci con to non diventano link del router (dalla 1.24.0).

TypeScript

import type { MenuProps, MenuEmits, MenuSlots, MenuItem, MenuItemCommandEvent } from '@pzeta/vue-components'