--- description: Display a select menu with advanced features. links: - label: GitHub icon: i-simple-icons-github to: https://github.com/nuxtlabs/ui/blob/dev/src/runtime/components/forms/SelectMenu.vue - label: 'Listbox' icon: i-simple-icons-headlessui to: 'https://headlessui.com/vue/listbox' --- ## Usage The SelectMenu component renders by default a [Select](/forms/select) component and is based on the `ui.select` preset. You can use most of the Select props to configure the display if you don't want to override the default slot such as [color](/forms/select#style), [variant](/forms/select#style), [size](/forms/select#size), [placeholder](/forms/select#placeholder), [icon](/forms/select#icon), [disabled](/forms/select#disabled), etc. Like the Select component, you can use the `options` prop to pass an array of strings or objects. ::component-example #default :select-menu-example-basic{class="w-full lg:w-48"} #code ```vue ``` :: ### Multiple You can use the `multiple` prop to select multiple values. ::component-example #default :select-menu-example-multiple{class="w-full lg:w-48"} #code ```vue ``` :: ### Objects You can pass an array of objects to `options` and either compare on the whole object or use the `by` prop to compare on a specific key. You can configure which field will be used to display the label through the `option-attribute` prop that defaults to `label`. ::component-example #default :select-menu-example-objects{class="w-full lg:w-48"} #code ```vue ``` :: If you only want to select a single object property rather than the whole object as value, you can set the `value-attribute` property. This prop defaults to `null`. ::component-example #default :select-menu-example-objects-value-attribute{class="w-full lg:w-48"} #code ```vue ``` :: ### Icon Use the `selected-icon` prop to set a different icon or change it globally in `ui.selectMenu.default.selectedIcon`. Defaults to `i-heroicons-check-20-solid`. ::component-card --- baseProps: class: 'w-full lg:w-48' placeholder: 'Select a person' options: ['Wade Cooper', 'Arlene Mccoy', 'Devon Webb', 'Tom Cook', 'Tanya Fox', 'Hellen Schmidt', 'Caroline Schultz', 'Mason Heaney', 'Claudie Smitham', 'Emil Schaefer'] props: selectedIcon: 'i-heroicons-hand-thumb-up-solid' excludedProps: - selectedIcon --- :: ::callout{icon="i-heroicons-light-bulb"} Learn how to customize icons from the [Select](/forms/select#icon) component. :: ### Search Use the `searchable` prop to enable search. Use the `searchable-placeholder` prop to set a different placeholder. This will use Headless UI [Combobox](https://headlessui.com/vue/combobox) component instead of [Listbox](https://headlessui.com/vue/listbox). ::component-card --- baseProps: class: 'w-full lg:w-48' placeholder: 'Select a person' options: ['Wade Cooper', 'Arlene Mccoy', 'Devon Webb', 'Tom Cook', 'Tanya Fox', 'Hellen Schmidt', 'Caroline Schultz', 'Mason Heaney', 'Claudie Smitham', 'Emil Schaefer'] props: searchable: true searchablePlaceholder: 'Search a person...' --- :: ### Async search Pass a function to the `searchable` prop to customize the search behavior and filter options according to your needs. The function will receive the query as its first argument and should return an array. Use the `debounce` prop to adjust the delay of the function. ::component-example #default :select-menu-example-async-search{class="w-full lg:w-48"} #code ```vue ``` :: ## Slots ### `label` You can override the `#label` slot and handle the display yourself. ::component-example #default :select-menu-example-multiple-slot{class="w-full lg:w-48"} #code ```vue ``` :: ### `default` You can also override the `#default` slot entirely. ::component-example #default :select-menu-example-button{class="w-full lg:w-48"} #code ```vue ``` :: ## Props :component-props ## Preset :component-preset