54 lines
1.2 KiB
JavaScript
54 lines
1.2 KiB
JavaScript
import { ref, computed } from 'vue'
|
|
|
|
export function useSearch(items, searchFields = []) {
|
|
const searchQuery = ref('')
|
|
const statusFilter = ref('')
|
|
const sourceFilter = ref('')
|
|
|
|
const filteredItems = computed(() => {
|
|
let result = items.value
|
|
|
|
// 文本搜索
|
|
if (searchQuery.value.trim()) {
|
|
const query = searchQuery.value.toLowerCase()
|
|
result = result.filter(item => {
|
|
if (searchFields.length === 0) {
|
|
// 默认搜索所有字符串字段
|
|
return Object.values(item).some(val =>
|
|
String(val).toLowerCase().includes(query)
|
|
)
|
|
}
|
|
return searchFields.some(field =>
|
|
String(item[field]).toLowerCase().includes(query)
|
|
)
|
|
})
|
|
}
|
|
|
|
// 状态过滤
|
|
if (statusFilter.value) {
|
|
result = result.filter(item => item.status === statusFilter.value)
|
|
}
|
|
|
|
// 来源过滤
|
|
if (sourceFilter.value) {
|
|
result = result.filter(item => item.source === sourceFilter.value)
|
|
}
|
|
|
|
return result
|
|
})
|
|
|
|
const resetFilters = () => {
|
|
searchQuery.value = ''
|
|
statusFilter.value = ''
|
|
sourceFilter.value = ''
|
|
}
|
|
|
|
return {
|
|
searchQuery,
|
|
statusFilter,
|
|
sourceFilter,
|
|
filteredItems,
|
|
resetFilters
|
|
}
|
|
}
|