Forms

MultiSelect

Dropdown per la selezione multipla con chips, filtro, toggle-all e limite di selezione. Supporta visualizzazione comma e chip per i valori selezionati.

Import

import { MultiSelect } from '@pzeta/vue-components'

Esempio Base

Props

PropTipoDefaultDescrizione
modelValueOptionValue[][]Array di valori selezionati (v-model)
optionsArray<string | number | Record<string, unknown>>[]Array di opzioni
optionLabelstring | ((o) => string)nullProprietà o funzione per il testo visualizzato
optionValuestring | ((o) => OptionValue)nullProprietà o funzione per il valore
optionDisabledstring | ((o) => boolean)nullProprietà o funzione per opzione disabilitata
optionGroupLabelstring | ((o) => string)nullLabel del gruppo di opzioni
optionGroupChildrenstring | ((o) => Record<string,unknown>[])nullProprietà con le opzioni figlie
placeholderstringTesto quando nessuna opzione è selezionata
display'comma' | 'chip''comma'Modalità di visualizzazione dei valori selezionati
maxSelectedLabelsnumber3Numero massimo di label prima di mostrare il conteggio
selectedItemsLabelstringTesto mostrato quando le selezioni superano maxSelectedLabels
selectionLimitnumbernullNumero massimo di selezioni consentite
showToggleAllbooleantrueMostra checkbox per selezionare/deselezionare tutto
filterbooleanfalseMostra campo di ricerca nel dropdown
filterMatchMode'startsWith' | 'contains' | 'endsWith''contains'Modalità di matching del filtro
filterPlaceholderstringPlaceholder del campo filtro
filterFieldsstring[]nullCampi su cui applicare il filtro
showClearbooleanfalseMostra pulsante per azzerare tutte le selezioni
labelstringnullLabel mostrata sopra il campo
helperTextstringnullTesto di aiuto sotto il campo
errorstringnullMessaggio di errore
invalidbooleanfalseStato di validazione invalido
disabledbooleanfalseDisabilita il componente
readonlybooleanfalseCampo in sola lettura
requiredbooleanfalseCampo obbligatorio
fluidbooleantrueOccupa tutta la larghezza disponibile
size'small' | 'medium' | 'large''medium'Dimensione del componente
variant'outlined' | 'filled''outlined'Variante visiva
severitySeverity'primary'Colore tema
loadingbooleanfalseStato di caricamento
scrollHeightstring'14rem'Altezza massima del dropdown
appendTo'body' | 'self''body'Target Teleport del dropdown
dataKeystringnullChiave univoca per le opzioni
inputIdstringnullID dell'input per accessibilità
namestringnullNome per i form nativi
ariaLabelstringnullAria label per screen reader
ariaLabelledbystringnullID dell'elemento label ARIA
checkmarkbooleantrueMostra checkbox accanto a ogni opzione
highlightOnSelectbooleantrueEvidenzia le opzioni selezionate
autoFilterFocusbooleanfalseFocus automatico sul filtro all'apertura
resetFilterOnHidebooleantrueResetta il filtro alla chiusura del dropdown
resetFilterOnClearbooleantrueResetta il filtro al clear
defaultValueOptionValue[]nullValore predefinito se modelValue non è fornito
loadingIconstringClasse CSS icona di caricamento
clearIconstringClasse CSS icona di cancellazione
dropdownIconstringClasse CSS icona dropdown

Emits

EventoPayloadDescrizione
update:modelValueOptionValue[]Aggiornamento v-model
change{ originalEvent: Event, value: OptionValue[] }Cambio di selezione
filter{ originalEvent: Event, value: string }Cambio del testo filtro
clearEventTutte le selezioni azzerate
selectAllChange{ originalEvent: Event, checked: boolean }Toggle-all attivato
chipRemove{ originalEvent: Event, value: OptionValue }Chip rimossa
focusEventIl componente riceve il focus
blurEventIl componente perde il focus
keydownKeyboardEventPressione tasto
keyupKeyboardEventRilascio tasto
beforeShowPrima dell'apertura del dropdown
showDropdown aperto
beforeHidePrima della chiusura del dropdown
hideDropdown chiuso

Slot

SlotScopeDescrizione
value{ value: OptionValue[], placeholder: string | null }Personalizza la visualizzazione del valore in modalità comma
chip{ value: OptionValue, option: Record<string, unknown> }Template per ogni chip in modalità chip
option{ option, selected, index }Template per ogni singola opzione
optiongroup{ option }Template per l'intestazione del gruppo
headerContenuto in cima al dropdown
footerContenuto in fondo al dropdown
content{ options, value, selectOption }Override completo del contenuto del dropdown
emptyMessaggio quando non ci sono opzioni
emptyfilterMessaggio quando il filtro non produce risultati
loaderStato di caricamento nel dropdown
loadingiconIcona di caricamento personalizzata
cleariconIcona del pulsante clear personalizzata
dropdownicon{ expanded: boolean }Icona del dropdown personalizzata
removetokeniconIcona di rimozione chip personalizzata
headercheckboxicon{ allSelected, partialSelected }Icona checkbox del toggle-all
itemcheckboxicon{ selected: boolean }Icona checkbox di ogni opzione

Esempi

Modalità chip

I valori selezionati vengono visualizzati come badge rimuovibili nel trigger:

Limite di selezione

Con filtro di ricerca

Numero massimo di label

Quando le selezioni superano maxSelectedLabels, viene mostrato un conteggio:

Stati

Chip personalizzata

<MultiSelect v-model="selected" :options="users" option-label="name" display="chip">
  <template #chip="{ value, option }">
    <span class="flex items-center gap-1 px-2 py-0.5 bg-blue-100 rounded-full text-xs">
      <img :src="option.avatar" class="w-4 h-4 rounded-full" />
      {{ option.name }}
    </span>
  </template>
</MultiSelect>

Accessibilità

  • Il trigger ha role="combobox" con aria-expanded e aria-haspopup="listbox"
  • Supporto navigazione tastiera: ArrowDown/Up naviga le opzioni, Enter/Space seleziona/deseleziona, Escape chiude
  • Il toggle-all è cliccabile e supporta stato parziale (partial check)
  • aria-label e aria-labelledby configurabili

TypeScript

import type { MultiSelectProps, MultiSelectEmits } from '@pzeta/vue-components'

const selectedCodes = ref<string[]>([])

const cities: Array<{ name: string; code: string }> = [
  { name: 'Roma', code: 'RM' },
  { name: 'Milano', code: 'MI' },
]