Vue Select provides two props accepting functions
that can be used to implement custom filtering
algorithms.
filter
v2.5.0+filterBy
v2.5.0+
By default, the component will perform a very basic check to see if an options label includes the current search text. If you're using scoped slots, you might have information within the option templates that should be searchable. Or maybe you just want a better search algorithm that can do fuzzy search matching.
# Filtering with Fuse.js
You can use the filter
and filterBy
props to hook right into something like
Fuse.js that can handle searching multiple object keys with fuzzy matchings.
<template>
<v-select
:filter="fuseSearch"
:options="books"
:get-option-label="(option) => option.title"
>
<template #option="{ author, title }">
{{ title }}
<br />
<cite>{{ author.firstName }} {{ author.lastName }}</cite>
</template>
</v-select>
</template>
<script>
import Fuse from 'fuse.js'
import books from '../data/books'
export default {
computed: {
books: () => books,
},
methods: {
fuseSearch(options, search) {
const fuse = new Fuse(options, {
keys: ['title', 'author.firstName', 'author.lastName'],
shouldSort: true,
})
return search.length
? fuse.search(search).map(({ item }) => item)
: fuse.list
},
},
}
</script>