Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
vue-multiselect
Advanced tools
vue-multiselect is a powerful and flexible Vue.js component for creating dropdowns with multi-select capabilities. It supports single and multiple selections, tagging, filtering, and custom rendering of options.
Single Select
This feature allows users to select a single option from a dropdown list. The `multiple` prop is set to `false` to enable single selection.
<template>
<multiselect v-model="selected" :options="options" :multiple="false"></multiselect>
</template>
<script>
import Multiselect from 'vue-multiselect';
export default {
components: { Multiselect },
data() {
return {
selected: null,
options: ['Option 1', 'Option 2', 'Option 3']
};
}
};
</script>
Multiple Select
This feature allows users to select multiple options from a dropdown list. The `multiple` prop is set to `true` to enable multiple selections.
<template>
<multiselect v-model="selected" :options="options" :multiple="true"></multiselect>
</template>
<script>
import Multiselect from 'vue-multiselect';
export default {
components: { Multiselect },
data() {
return {
selected: [],
options: ['Option 1', 'Option 2', 'Option 3']
};
}
};
</script>
Tagging
This feature allows users to add new options (tags) to the dropdown list. The `taggable` prop is set to `true`, and the `@tag` event is used to handle the addition of new tags.
<template>
<multiselect v-model="selected" :options="options" :taggable="true" @tag="addTag"></multiselect>
</template>
<script>
import Multiselect from 'vue-multiselect';
export default {
components: { Multiselect },
data() {
return {
selected: [],
options: ['Option 1', 'Option 2', 'Option 3']
};
},
methods: {
addTag(newTag) {
this.options.push(newTag);
this.selected.push(newTag);
}
}
};
</script>
Custom Option Rendering
This feature allows users to customize the rendering of options in the dropdown list. The `custom-label` prop is used to define a method that returns a custom label for each option.
<template>
<multiselect v-model="selected" :options="options" :custom-label="customLabel"></multiselect>
</template>
<script>
import Multiselect from 'vue-multiselect';
export default {
components: { Multiselect },
data() {
return {
selected: null,
options: [
{ name: 'Option 1', id: 1 },
{ name: 'Option 2', id: 2 },
{ name: 'Option 3', id: 3 }
]
};
},
methods: {
customLabel(option) {
return `${option.name} (ID: ${option.id})`;
}
}
};
</script>
vue-select is a Vue.js component that provides a similar set of features to vue-multiselect, including single and multiple selections, tagging, and custom option rendering. It is known for its simplicity and ease of use.
vue-multiselect-next is a fork of vue-multiselect that aims to provide additional features and improvements. It offers similar functionalities with enhanced performance and additional customization options.
vue-treeselect is a multi-select component with nested options support. It is particularly useful for hierarchical data structures and provides features like single and multiple selections, search, and custom rendering.
Documentation for v3.0.0 is almost the same as for v2.x as it is mostly backward compatible. For the full docs for v3 and previous versions, check out: vue-multiselect.js.org
npm install vue-multiselect@next
<template>
<div>
<VueMultiselect
v-model="selected"
:options="options">
</VueMultiselect>
</div>
</template>
<script>
import VueMultiselect from 'vue-multiselect'
export default {
components: { VueMultiselect },
data () {
return {
selected: null,
options: ['list', 'of', 'options']
}
}
}
</script>
<style src="vue-multiselect/dist/vue-multiselect.css"></style>
Example JSFiddle – Use this for issue reproduction.
<VueMultiselect
:model-value="value"
:options="source"
:searchable="false"
:close-on-select="false"
:allow-empty="false"
@update:model-value="updateSelected"
label="name"
placeholder="Select one"
track-by="name"
/>
<VueMultiselect
v-model="value"
:options="source"
:close-on-select="true"
:clear-on-select="false"
placeholder="Select one"
label="name"
track-by="name"
/>
<VueMultiselect
v-model="multiValue"
:options="source"
:multiple="true"
:close-on-select="true"
placeholder="Pick some"
label="name"
track-by="name"
/>
with @tag
event
<VueMultiselect
v-model="taggingSelected"
:options="taggingOptions"
:multiple="true"
:taggable="true"
@tag="addTag"
tag-placeholder="Add this as new tag"
placeholder="Type to search or add tag"
label="name"
track-by="code"
/>
addTag (newTag) {
const tag = {
name: newTag,
code: newTag.substring(0, 2) + Math.floor((Math.random() * 10000000))
}
this.taggingOptions.push(tag)
this.taggingSelected.push(tag)
},
<VueMultiselect
v-model="selectedCountries"
:options="countries"
:multiple="multiple"
:searchable="searchable"
@search-change="asyncFind"
placeholder="Type to search"
label="name"
track-by="code"
>
<template #noResult>
Oops! No elements found. Consider changing the search query.
</template>
</VueMultiselect>
methods: {
asyncFind (query) {
this.countries = findService(query)
}
}
Thanks to Matt Elen for contributing this version!
A Vue 3 upgrade of @shentao's vue-mulitselect component. The idea is that when you upgrade to Vue 3, you can swap the two components out, and everything should simply work. Feel free to check out our story of how we upgraded our product to Vue 3 on our blog at suade.org
# distribution build with minification
npm run bundle
# run unit tests
npm run test
FAQs
Multiselect component for Vue
The npm package vue-multiselect receives a total of 226,999 weekly downloads. As such, vue-multiselect popularity was classified as popular.
We found that vue-multiselect demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
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.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.