DtSelectMenu is bound to a value using v-model, which emits the selected option's value. To wire DtSelectMenu to a reactive store (such as Vuex or Pinia), bind :modelValue to the store getter and listen for @update:modelValue to commit the mutation — or use v-model with a computed setter.
multiple attribute. Users often don't understand how to select multiple items from the select element (e.g. by holding down a modifier key).select is for selecting a choice that is only confirmed by a separate submit action (much like a Checkbox). For immediate actions consider the Dropdown component.A select is normally paired with a label, but there are times when it can be used without a label. Don't rely on the placeholder text as a label.
<dt-select-menu :options="[ { value: ``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" label="Default" :model-value="modelValue" @update:model-value="onInput" /> <dt-select-menu :options="[ { value: ``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" label="Disabled" disabled :model-value="modelValue" @update:model-value="onInput" />
<dt-select-menu
:options="[
{ value: ``, label: `Please select one` },
{ value: `1`, label: `Option 1` },
{ value: `2`, label: `Option 2` },
{ value: `3`, label: `Option 3` },
]"
label="Label"
description="Optional description text"
:model-value="modelValue"
@update:model-value="onInput"
/>Provides feedback to the user based on their interaction, or lack thereof, with a select.
<dt-select-menu :options="[ { value: ``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" :messages="[{ message: `Critical validation message`, type: `critical` }]" label="Label" :model-value="modelValue" @update:model-value="onInput" /> <dt-select-menu :options="[ { value: ``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" :messages="[{ message: `Positive validation message`, type: `positive` }]" label="Label" :model-value="modelValue" @update:model-value="onInput" /> <dt-select-menu :options="[ { value: ``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" :messages="[{ message: `Warning validation message`, type: `warning` }]" label="Label" :model-value="modelValue" @update:model-value="onInput" />
<dt-select-menu :options="[ { value: ``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" :messages="[{ message: `Critical validation message`, type: `critical` }]" label="Label" :model-value="modelValue" @update:model-value="onInput" :show-messages="false" /> <dt-select-menu :options="[ { value:``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" :messages="[{ message: `Positive validation message`, type: `positive` }]" label="Label" :model-value="modelValue" @update:model-value="onInput" :show-messages="false" /> <dt-select-menu :options="[ { value: ``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" :messages="[{ message: `Warning validation message`, type: `warning` }]" label="Label" :model-value="modelValue" @update:model-value="onInput" :show-messages="false" />
<dt-select-menu :options="[ { value: ``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" :model-value="modelValue" @update:model-value="onInput" > <template #label> <div>Slotted label</div> </template> </dt-select-menu>
<dt-select-menu :options="[ { value: ``, label: `Please select one` }, { value: `1`, label: `Option 1` }, { value: `2`, label: `Option 2` }, { value: `3`, label: `Option 3` }, ]" :model-value="modelValue" @update:model-value="onInput" > <template #description> <div>Slotted description</div> </template> </dt-select-menu>
<dt-select-menu :model-value="modelValue" @update:model-value="onInput" > <template #default> <option v-for="option in options" :key="`with-slotted-options-${option.value}`" :value="option.value" > {{ option.label }} </option> </template> </dt-select-menu>
We offer different sizes for instances in which the interface requires a smaller or larger select. In general, though, use the base 300 (medium) size select as much as possible, especially in forms.
<dt-select-menu
:options="[
{ value: ``, label: `Please select one` },
{ value: `1`, label: `Option 1` },
{ value: `2`, label: `Option 2` },
{ value: `3`, label: `Option 3` },
]"
label="Label"
:size="100|200|300|400|500"
:model-value="modelValue"
@update:model-value="onInput"
/>The label text size is automatically derived from the component's size prop. Use the label-size prop to override this when you need a different label size independent of the select size. For example, the default label size for a :size="300" select menu is 300, but you can override it from 100 to 400.
<dt-select-menu
:options="options"
label="Label"
:size="100"
:label-size="100"
/>Override the label font weight independently of the label size. Valid values are bold, semibold, medium, and normal.
<dt-select-menu
:options="options"
label="Label"
label-strength="bold|semibold|medium|normal"
/>label for attribute match the select id.labels. Labelled selects are user-friendly.aria-required property and use the validation message for input errors.aria-describedby with the id of the validation message.import { DtSelectMenu } from '@dialpad/dialtone-vue';
Name
|
Type
|
|---|---|
default | Slot for select menu options, defaults to options prop |
description | Slot for description, defaults to description prop |
label | Slot for label, defaults to label prop |
Name
|
Default
|
Type
|
|---|---|---|
description | '' | string Description for the select.
Can also be overridden with a slot of the same name. |
descriptionChildProps | {} | object A set of props that are passed into the description container |
descriptionClass | '' | string|array|object Used to customize the description container |
disabled | false |
"true"
|
"false"
Disabled state of the select |
label | '' | string Label for the select.
Can also be overridden with a slot of the same name. |
labelChildProps | {} | object A set of props that are passed into the label container |
labelClass | '' | string|array|object Used to customize the label container |
labelSize | null |
"100"
|
"200"
|
"300"
|
"400"
Overrides the label text size. When not provided, the label size
is derived from the component size prop. |
labelStrength | null |
"bold"
|
"semibold"
|
"medium"
|
"normal"
Overrides the label font weight. |
messages | [] | array Validation messages |
messagesChildProps | {} | object A set of props that are passed into the validation messages component |
messagesClass | '' | string|array|object Used to customize the validation messages component |
modelValue | '' | string|number The value of the select menu |
optionChildProps | {} | object A set of props that are passed into each option, should options be provided via prop |
optionClass | '' | string|array|object Used to customize each option, should options be provided via prop |
options | [] | array Select Menu Options, overridden by default slot. Each option has the following structure:
|
selectClass | '' | string|array|object Used to customize the select |
showLabel | true |
"true"
|
"false"
Determines visibility of select label. |
showMessages | true |
"true"
|
"false"
Used to hide / show the validation messages |
size | 300 |
"100"
|
"200"
|
"300"
|
"400"
|
"500"
Controls the size of the select |
Name
|
Type
|
|---|---|
update:modelValue | String | Number Event fired to sync the modelValue prop with the parent component |
Class
|
Applies to
|
Description
|
|---|
Select menu documentation last updated Friday, September 4, 2026
fix/popover-modal-zindex-scope