Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@vueform/multiselect

Package Overview
Dependencies
Maintainers
1
Versions
59
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@vueform/multiselect

Vue 3 multiselect component with single select, multiselect and tagging options.

  • 1.5.0
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
72K
decreased by-8.96%
Maintainers
1
Weekly downloads
 
Created
Source
npm npm bundle size (scoped version) Discord npm

Vue 3 Multiselect






Sponsors

Other libraries

  • @vueform/slider - Vue 3 slider component with multihandles, tooltips merging and formatting.
  • @vueform/toggle - Vue 3 toggle component with labels, custom slots and styling options.

Multiselect features

  • Vue 2 & 3 support
  • No dependencies
  • Lightweight (<6 kB gzipped)
  • 100% coverage
  • TypeScript support
  • ESM support
  • Single select options
  • Multiple select options
  • Tags
  • Async options
  • Search & filtering
  • Custom slots
  • Events
  • Fully configurable

Demo

Check out our demo.

Installation

npm install @vueform/multiselect

Using with Vue 3

<template>
  <div>
    <Multiselect
      v-model="value"
      :options="options"
    />
  </div>
</template>

<script>
  import Multiselect from '@vueform/multiselect'

  export default {
    components: {
      Multiselect,
    },
    data() {
      return {
        value: null,
        options: [
          'Batman',
          'Robin',
          'Joker',
        ]
      }
    }
  }
</script>

<style src="@vueform/multiselect/themes/default.css"></style>

Using with Vue 2

When using Vue 2 install @vue/composition-api via npm/yarn first:

npm i @vue/composition-api --save-dev

Then install the plugin for Vue:

import Vue from 'vue'
import VueCompositionAPI from '@vue/composition-api'

Vue.use(VueCompositionAPI)

After that make sure to change the imported Multiselect module to:

import Multiselect from '@vueform/multiselect/dist/multiselect.vue2.js'

Using with Nuxt.js

First you need install @nuxtjs/composition-api:

npm i @nuxtjs/composition-api --save-dev

Then you need to enable it as a module in nuxt.config.js:

{
  buildModules: [
    '@nuxtjs/composition-api'
  ]
}

After that make sure to change the imported module to Vue 2 version of Multiselect, as Nuxt.js still depends on that:

import Multiselect from '@vueform/multiselect/dist/multiselect.vue2.js'

Support

Join our Discord channel or open an issue.

Basic props

NameTypeDefaultDescription
modestringsinglePossible values: single|multiple|tags.
optionsarray|object|function[]List of options. Can be:
- an array (eg. [1,2,3])
- an object (eg. {a:1,b:2,c:3})
- an array of objects [{value:1,label:'v1'},{value:2,label:'v2'},{value:3,label:'v3',disabled:true}]
- a function returning a Promise (async function) with query input param. The promise should return options as an object or as an array of objects.
When an array of objects is provided it must have properties that equal to :valueProp's, :trackBy's and :label's value.
requiredbooleanfalseWhether the HTML5 required attribute should be used for multiselect (using an invisible fake input).
searchablebooleanfalseWhether the options should be searchable.
valuePropstring'value'If you provide an array of objects as options this property should be used as the value of the option.
trackBystring'label'The name of the property that should be searched when searchable is true and an array of objects are provided as :options.
labelstring'label'If you provide an array of objects as options the value this property will be displayed as selected option.
placeholderstringnullThe text that should be displayed before any option is selected.
multipleLabelfunctionA function that returns the label to be displayed for selected options when using multiple mode. It receives value as an argument. By default it renders 1 option selected and [n] options selected based on value length.
disabledbooleanfalseWhether the input should be disabled for the user (API can still be used programmatically).
maxnumber-1The maximum number of options that can be selected when using multiple or tags mode. If -1 the number of options won't be limited.
limitnumber-1The maximum number of options that should be displayed. If -1 the number of options won't be limited.
loadingbooleanfalseWhether a loading spinner should be shown.
idstring'multiselect'The id of the multiselect container DOM.
caretbooleantrueWhether should display the caret symbol on the right.
maxHeightnumber160The maximum height of options list (px).
noOptionsTextstring'The list is empty'The text that should be displayed when options list is empty.
noResultsTextstring'No results found'The text that should be displayed when there are no search results.
openDirectionstringbottomWhether the option list should be displayed above or below the multiselect. Possible values: top|bottom

Advanced Props

NameTypeDefaultDescription
canDeselectbooleantrueWhether a selected option can be deselected when using single mode.
clearOnSearchbooleanfalseWhether the option list should be cleared when a new character is typed before loading new options list, when using async options.
clearOnSelectbooleantrueWhether the option list should be cleared upon selecting an option when using async options.
delaynumber-1The delay in milliseconds that should occur between the last typed character and refreshing an async option list. If -1 the option list will not refresh when the search query changes. If 0 it will refresh without delay.
filterResultsbooleantrueWhether option list should be filtered by search query. This may be set to false if you are handling filtering manually when returning async options.
minCharsnumber0The minimum number of characters that should be typed to refresh async option list. If 0 it will refresh even when the search field becomes empty.
resolveOnLoadbooleantrueWhether async options should be loaded initially (with an empty query). This should be true if you are planning to load non-object value(s) initially while using async options (to fetch matching objects for values).
appendNewTagbooleantrueWhether it should append new tag automatically to option list when using tags mode with createTag. If set to false you need to take care of appending a new tag to the provided :options list upon @tag event.
createTagbooleanfalseWhether it should allow creating new tag based on search query when using tags mode.
addTagOnarray['enter']The list of keys that creates a new tag while typing in the search field when having createTag enabled. Possible values: enter|space.
hideSelectedbooleantrueWhether selected options should be excluded from the option list when using multiple or tags mode.
showOptionsbooleantrueWhether option list should be displayed. Can be used to create free-typed tags.
objectbooleanfalseWhether the value should be stored as an object.
If false:
value: ['js','jsx','ts']
If true:
value: [
  {value:'js',label:'Javascript'},
  {value:'jsx',label:'JSX'},
  {value:'ts',label:'Typescript'}
]
nativeSupportbooleanfalseWhether hidden input fields should be appended to achieve native data handling.

API

NameParamsDescription
openOpens the options list and focuses the multiselect.
closeCloses the options list and blurs the multiselect.
selectvalue, optionSelects an option based on its value.
deselectvalue, optionDeselects an option based on its value.
removevalue, optionAlias for deselect.
clearDeselects all selected options.
refreshOptionscallbackRefreshes async options list.

To access API use ref on Multiselect component:

<Multiselect
  v-model="value"
  :options="options"
  ref="multiselect"
/>
// eg:
mounted() {
  this.$refs.multiselect.open()
}

Events

EventAttributesDescription
@changevalueEmitted after the value is changed.
@closeEmitted after closing the option list.
@deselectoptionEmitted after an option is deselected or a tag is removed.
@openEmitted after opening the option list.
@search-changequeryEmitted after a character is typed.
@selectoptionEmitted after an option or tag is selected.
@tagqueryEmitted after enter is hit when a new tag is being created.
@clearEmitted when the options are cleared.

Slots

SlotAttributesDescription
placeholderRendered as placeholder when the multiselect does not have value and placeholder prop is defined.
afterlistRendered after the options list.
beforelistRendered before the options list.
multiplelabelvaluesRendered when using multiple mode and options are selected. By default it renders the return value of multipleLabel function.
nooptionsRendered when the options list is empty. By default renders noOptionsText.
noresultsRendered when there are no search results. By default renders noResultsText.
optionoption, searchRenders an option in options list.
singlelabelvalueRendered when using single mode and an option is selected. By default it renders the :label if the selected option.
tagoption, handleTagRemove, disabledRenders a tag when using tags mode. When disabled the remove icon should not be displayed. The handleTagRemove prop should be used to trigger the removal of the tag.
caretRenders a small triangle on the right side of the multiselect.
clearRenders a remove icon if the multiselect has any value.
spinnerRenders a loader icon when async options are being fetched.

Note: we don't use camelCase because they are normalized back to lowercase when written in DOM.

Examples

Single select

<Multiselect
  v-model="value"
  :options="['Batman', 'Robin', 'Joker']"
/>

JSFiddle - Example #1

Multiselect with object options

<Multiselect
  v-model="value"
  mode="multiple"
  :options="{
    batman: 'Batman',
    robin: 'Robin',
    joker: 'Joker'
  }"
/>

JSFiddle - Example #2

Multiselect with disabled options

<Multiselect
  v-model="value"
  mode="multiple"
  :options="[
    { value: 'batman', label: 'Batman' },
    { value: 'robin', label: 'Robin', disabled: true },
    { value: 'joker', label: 'Joker' },
  ]"
/>

JSFiddle - Example #3

Tags with search, create and array of objects options

<Multiselect
  v-model="value"
  mode="tags"
  :searchable="true"
  :createTag="true"
  :options="[
    { value: 'batman', label: 'Batman' },
    { value: 'robin', label: 'Robin' },
    { value: 'joker', label: 'Joker' },
  ]"
/>

JSFiddle - Example #4

Autocomplete with async options

<Multiselect
  v-model="value"
  placeholder="Choose a programming language"
  :filterResults="false"
  :minChars="1"
  :resolveOnLoad="false"
  :delay="0"
  :searchable="true"
  :options="async function(query) {
    return await fetchLanguages(query) // check JS block in JSFiddle for implementation
  }"
/>

JSFiddle - Example #5

Tags with async options

<Multiselect
  v-model="value"
  mode="tags"
  placeholder="Choose your stack"
  :filterResults="false"
  :minChars="1"
  :resolveOnLoad="false"
  :delay="0"
  :searchable="true"
  :options="async function(query) {
    return await fetchLanguages(query) // check JS block in JSFiddle for implementation
  }"
/>

JSFiddle - Example #6

Select with custom options slot

<Multiselect
  v-model="value"
  placeholder="Select your character"
  label="name"
  :options="[
    { value: 'captainamerica', name: 'Captain America', icon: 'https://cdn2.iconfinder.com/data/icons/avengers-filled/48/03_-_Captain_America_-_infinity_war_-_end_game_-_marvel_-_avengers_-_super_hero-512.png' },
    { value: 'spiderman', name: 'Spiderman', icon: 'https://cdn2.iconfinder.com/data/icons/avengers-filled/48/12_-_Spiderman_-_infinity_war_-_end_game_-_marvel_-_avengers_-_super_hero-512.png' },
    { value: 'ironman', name: 'Iron Man', icon: 'https://cdn2.iconfinder.com/data/icons/avengers-filled/48/02_-_IRONMAN_-_infinity_war_-_end_game_-_marvel_-_avengers_-_super_hero-512.png' },
  ]"
>
  <template v-slot:singlelabel="{ value }">
    <div class="multiselect-single-label">
      <img class="character-label-icon" :src="value.icon"> {{ value.name }}
    </div>
  </template>

  <template v-slot:option="{ option }">
    <img class="character-option-icon" :src="option.icon"> {{ option.name }}
  </template>
</Multiselect>

JSFiddle - Example #7

Multiselect with custom label slot

<Multiselect
  v-model="value"
  mode="multiple"
  placeholder="Select your characters"
  :options="{
    batman: 'Batman',
    robin: 'Robin',
    joker: 'Joker'
  }"
>
  <template v-slot:multiplelabel="{ values }">
    <div class="multiselect-multiple-label">
      {{ values.length }} characters selected
    </div>
  </template>
</Multiselect>

JSFiddle - Example #8

Tags with custom tags slot

<template>
  <Multiselect
    v-model="value"
    mode="tags"
    placeholder="Select employees"
    trackBy="name"
    label="name"
    :search="true"
    :options="[
      { value: 'judy', name: 'Judy', image: 'https://randomuser.me/api/portraits/med/women/1.jpg' },
      { value: 'jane', name: 'Jane', image: 'https://randomuser.me/api/portraits/med/women/2.jpg' },
      { value: 'john', name: 'John', image: 'https://randomuser.me/api/portraits/med/men/1.jpg' },
      { value: 'joe', name: 'Joe', image: 'https://randomuser.me/api/portraits/med/men/2.jpg' }
    ]"
  >
      <template v-slot:tag="{ option, handleTagRemove, disabled }">
        <div class="multiselect-tag is-user">
          <img :src="option.image">
          {{ option.name }}
          <i
            v-if="!disabled"
            @click.prevent
            @mousedown.prevent.stop="handleTagRemove(option, $event)"
          />
        </div>
      </template>
  </Multiselect>
</template>

<style>
  .multiselect-tag.is-user {
    padding: 5px 8px;
    border-radius: 22px;
    background: #35495e;
    margin: 3px 3px 8px;
  }

  .multiselect-tag.is-user img {
    width: 18px;
    border-radius: 50%;
    height: 18px;
    margin-right: 8px;
    border: 2px solid #ffffffbf;
  }

  .multiselect-tag.is-user i:before {
    color: #ffffff;
    border-radius: 50%;;
  }

  .user-image {
    margin: 0 6px 0 0;
    border-radius: 50%;
    height: 22px;
  }
</style>

JSFiddle - Example #9

About Vueform

Vueform streamlines the entire form building process in Vue 2 & 3. It comes with 30+ elements, file uploads, element nesting, 50+ validators, conditions, form steps, i18n including reactive configuration, API access, ESM modules and many more. Check out our live demos or see all the features and sign up for beta to get early access.

License

MIT

FAQs

Package last updated on 17 May 2021

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc