57 lines
963 B
JavaScript
57 lines
963 B
JavaScript
import Fuse from 'fuse.js'
|
|
import { isRef, ref, unref, watch } from 'vue'
|
|
|
|
export default (items, options, term) => {
|
|
const fuse = ref(null)
|
|
const result = ref(unref(items))
|
|
|
|
watch(items, (value) => {
|
|
if (fuse.value) {
|
|
fuse.value.setCollection(unref(value))
|
|
result.value = unref(items)
|
|
}
|
|
})
|
|
|
|
watch(
|
|
() => options,
|
|
(value) => {
|
|
fuse.value = new Fuse(unref(items), { minMatchCharLength: 2, ...value })
|
|
},
|
|
{ immediate: true },
|
|
)
|
|
|
|
if (isRef(term)) {
|
|
watch(term, (value) => {
|
|
search(value)
|
|
})
|
|
}
|
|
|
|
const search = (term = '') => {
|
|
if (!fuse.value)
|
|
return
|
|
|
|
term = term.trim()
|
|
|
|
if (term.length < 2) {
|
|
result.value = unref(items)
|
|
|
|
return
|
|
}
|
|
|
|
const documents = fuse.value.search(term)
|
|
|
|
result.value = documents.map(doc => doc.item)
|
|
}
|
|
|
|
const reset = () => {
|
|
result.value = unref(items)
|
|
}
|
|
|
|
return {
|
|
fuse,
|
|
result,
|
|
search,
|
|
reset,
|
|
}
|
|
}
|