Skip to content

Select

Basic Usage

Basic usage. Use v-model for two-way data binding.

In single-select mode, value only accepts strings and numbers. In multi-select mode, it only accepts arrays. The component automatically returns selected data based on the Option value.

You can add style to the Select, such as width.

<template>
  <div>
    <b-select v-model="select" style="width: 200px" clearable>
      <b-option
        v-for="item in cityList"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      ></b-option>
    </b-select>
    <span>{{ select }}</span>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const select = ref('')
const cityList = [
  { value: 'beijing', label: 'Beijing' },
  { value: 'nanjing', label: 'Nanjing' },
  { value: 'shanghai', label: 'Shanghai' },
  { value: 'xuzhou', label: 'Xuzhou' },
  { value: 'guangzhou', label: 'Guangzhou' },
  { value: 'shenzhen', label: 'Shenzhen' }
]
</script>

Disabled Options and Disabled State

Disabled state and individual option disabling can be configured.

 
<template>
  <div>
    <b-select v-model="select" style="width: 200px" clearable>
      <b-option
        v-for="item in cityList"
        :key="item.value"
        :label="item.label"
        :value="item.value"
        :disabled="item.disabled"
      ></b-option>
    </b-select>
    &nbsp;
    <b-select v-model="select" style="width: 200px" disabled>
      <b-option
        v-for="item in cityList"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      ></b-option>
    </b-select>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const select = ref('')
const cityList = [
  { value: 'beijing', label: 'Beijing' },
  { value: 'nanjing', label: 'Nanjing' },
  { value: 'shanghai', label: 'Shanghai', disabled: true },
  { value: 'xuzhou', label: 'Xuzhou' },
  { value: 'guangzhou', label: 'Guangzhou' },
  { value: 'shenzhen', label: 'Shenzhen' }
]
</script>

Other States

Clearable, grouped, or custom template display.

<template>
  <div>
    <b-select v-model="select" style="width: 200px" clearable placeholder="Clearable">
      <b-option
        v-for="item in cityList"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      ></b-option>
    </b-select>

    <b-select v-model="select" style="width: 200px; margin-left: 20px" placeholder="Grouped">
      <b-option-group label="Municipalities">
        <b-option value="beijing" label="Beijing"></b-option>
        <b-option value="shanghai" label="Shanghai"></b-option>
      </b-option-group>
      <b-option-group label="Popular Cities">
        <b-option value="xuzhou" label="Xuzhou"></b-option>
        <b-option value="nanjing" label="Nanjing"></b-option>
        <b-option value="suzhou" label="Guangzhou"></b-option>
        <b-option value="shenzhen" label="Shenzhen"></b-option>
      </b-option-group>
    </b-select>

    <b-select v-model="select" style="width: 200px; margin-left: 20px" placeholder="Customoption">
      <b-option value="beijing" label="Beijing">
        <span>Beijing</span>
        <span style="float: right; color: #ccc">beijing</span>
      </b-option>
      <b-option value="shanghai" label="Shanghai">
        <span>Shanghai</span>
        <span style="float: right; color: #ccc">shanghai</span>
      </b-option>
      <b-option value="xuzhou" label="Xuzhou">
        <span>Xuzhou</span>
        <span style="float: right; color: #ccc">xuzhou</span>
      </b-option>
    </b-select>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const select = ref('')
const cityList = [
  { value: 'beijing', label: 'Beijing' },
  { value: 'nanjing', label: 'Nanjing' },
  { value: 'shanghai', label: 'Shanghai' },
  { value: 'xuzhou', label: 'Xuzhou' },
  { value: 'guangzhou', label: 'Guangzhou' },
  { value: 'shenzhen', label: 'Shenzhen' }
]
</script>

Search Mode

Search and filter options.

<template>
  <div>
    <b-select v-model="select" style="width: 200px" filterable>
      <b-option
        v-for="item in cityList"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      ></b-option>
    </b-select>
    <span>{{ select }}</span>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const select = ref('')
const cityList = [
  { value: 'beijing', label: 'Beijing' },
  { value: 'nanjing', label: 'Nanjing' },
  { value: 'shanghai', label: 'Shanghai' },
  { value: 'xuzhou', label: 'Xuzhou' },
  { value: 'guangzhou', label: 'Guangzhou' },
  { value: 'shenzhen', label: 'Shenzhen' }
]
</script>

Multi-Select and Collapse

Multi-selection is supported.

[]
<template>
  <div>
    <b-select v-model="select" style="width: 300px" multiple>
      <b-option
        v-for="item in cityList"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      ></b-option>
    </b-select>
    <b-select v-model="select" style="width: 300px; margin-left: 20px" multiple collapse-tags>
      <b-option
        v-for="item in cityList"
        :key="item.value"
        :label="item.label"
        :value="item.value"
      ></b-option>
    </b-select>
    <span>{{ select }}</span>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const select = ref([])
const cityList = [
  { value: 'beijing', label: 'BeijingBeijingBeijingBeijingBeijingBeijingBeijingBeijingBeijingBeijing' },
  { value: 'nanjing', label: 'Nanjing' },
  { value: 'shanghai', label: 'Shanghai' },
  { value: 'xuzhou', label: 'Xuzhou' },
  { value: 'guangzhou', label: 'Guangzhou' },
  { value: 'shenzhen', label: 'Shenzhen' },
  { value: 'xuzhou', label: 'Xuzhou' },
  { value: 'guangzhou', label: 'Guangzhou' },
  { value: 'shenzhen', label: 'Shenzhen' }
]
</script>

Prefix Mode

You can set a prefix for the dropdown.

<template>
  <div style="width: 200px">
    <b-select v-model="select">
      <template #prefix>
        <i class="b-iconfont b-icon-alert"></i>
      </template>
      <b-option value="beijing" label="Beijing"></b-option>
      <b-option value="shanghai" label="Shanghai"></b-option>
      <b-option value="xuzhou" label="Xuzhou"></b-option>
      <b-option value="nanjing" label="Nanjing"></b-option>
    </b-select>
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const select = ref('')
</script>

Create New Item

Allows creating entries not in the list. Use allow-create to enable input and creation; filterable must be true.

[]
<template>
  <b-row :gutter="20">
    <b-col :span="8">
      <b-select
        v-model="selected"
        multiple
        filterable
        allow-create
        default-first-option
        placeholder="Please selectCity"
      >
        <b-option
          v-for="item in cityList"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        ></b-option>
      </b-select>
    </b-col>
    <b-col :span="16">
      <div style="height: 32px; line-height: 32px">{{ selected }}</div>
    </b-col>
  </b-row>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const selected = ref([])
const cityList = [
  { value: 'beijing', label: 'Beijing' },
  { value: 'nanjing', label: 'Nanjing' },
  { value: 'shanghai', label: 'Shanghai' },
  { value: 'xuzhou', label: 'Xuzhou' },
  { value: 'guangzhou', label: 'Guangzhou' },
  { value: 'shenzhen', label: 'Shenzhen' }
]
</script>

Sizes

Four sizes are available:

<template>
  <b-row :gutter="20">
    <b-col :span="6">
      <b-select v-model="select" clearable size="large">
        <b-option
          v-for="item in cityList"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        ></b-option>
      </b-select>
    </b-col>
    <b-col :span="6">
      <b-select v-model="select" clearable>
        <b-option
          v-for="item in cityList"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        ></b-option>
      </b-select>
    </b-col>
    <b-col :span="6">
      <b-select v-model="select" clearable size="small">
        <b-option
          v-for="item in cityList"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        ></b-option>
      </b-select>
    </b-col>
    <b-col :span="6">
      <b-select v-model="select" clearable size="mini">
        <b-option
          v-for="item in cityList"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        ></b-option>
      </b-select>
    </b-col>
  </b-row>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const select = ref('')
const cityList = [
  { value: 'beijing', label: 'Beijing' },
  { value: 'nanjing', label: 'Nanjing' },
  { value: 'shanghai', label: 'Shanghai' },
  { value: 'xuzhou', label: 'Xuzhou' },
  { value: 'guangzhou', label: 'Guangzhou' },
  { value: 'shenzhen', label: 'Shenzhen' }
]
</script>

Select props

ParameterDescriptionTypeOptionsDefault
v-modelSpecifies the value of the selected item. Supports v-model for two-way binding.String / Number / Boolean / Object
multipleMulti-selectBooleanfalse
disabledDisable dBooleanfalse
clearableClear options, only effective in single-select modeBooleanfalse
filterableEnable searchBooleanfalse
sizeSelect sizeStringlarge / small / default / minidefault
placeholderPlaceholder textString
value-keyKey name used as the unique identifier for value. Required when the bound value is an object.stringvalue
no-match-textText displayed when no search results match, can also use #empty slot to setStringNo matching data
no-data-texText displayed when options are emptyStringNo data
allow-createWhether to allow creating new items not in the list. Must be used with filterableBooleanfalse
filter-methodCustom search methodFunction
remoteWhether to enable remote searchbooleanfalse
loadingWhether data is currently being fetched from remotebooleanfalse
loading-textText displayed during remote loadingbooleanLoading...
placementExpansion direction of the dropdownStringtop / bottom / top-start / bottom-start / top-end / bottom-endbottom-start
append-to-bodyAppend the overlay to bodyBooleantrue
multiple-limitMaximum number of selections allowed in multi-select modeNumber
collapse-tagsWhether to collapse tags in multi-select modeBooleanfalse
popper-classCustom class name for the popupString
default-first-optionWhen pressing Enter in the input, select the first matching option. Must be used with filterable or remoteBooleanfalse
clear-iconClass name for the clear iconStringclose-circle-fill

Select events

Event NameDescriptionReturn Value
changeTriggered when the selected option changes, returns value by defaultCurrently selected item
clearTriggered when the clear button is clicked
visible-changeTriggered when the dropdown appears/hidestrue when appearing, false when hiding
remove-tagTriggered when a tag is removed in multi-select modeValue of the removed tag
blurTriggered when focus is lost(event: Event)
focusTriggered when focus is gained(event: Event)

Select slot

NameDescription
prefixCustom prefix icon inside the Select
emptyContent when no options are available

Option props

ParameterDescriptionTypeOptionsDefault
valueOption value. Filtering is based on this property value by default. Required.string/number
labelOption display content. By default the slot content is read. If no slot, this label value is read first. If no label, the value is read.String
disabledDisable the current itemBooleanfalse

OptionGroup props

ParameterDescriptionTypeOptionsDefault
labelGroup nameString
disabledDisable all options under this groupBooleanfalse