107 lines
2.5 KiB
Vue
Raw Normal View History

2023-05-29 11:05:46 +08:00
<template>
<ElDialog v-if="isModal" v-model="showSearch" :show-close="false" title="菜单搜索">
2023-05-29 11:26:51 +08:00
<el-select
filterable
:reserve-keyword="false"
remote
placeholder="请输入菜单内容"
:remote-method="remoteMethod"
style="width: 100%"
@change="handleChange"
>
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</ElDialog>
<div v-else class="custom-hover" @click.stop="showTopSearch = !showTopSearch">
<Icon icon="ep:search" />
<el-select
filterable
:reserve-keyword="false"
remote
placeholder="请输入菜单内容"
:remote-method="remoteMethod"
class="overflow-hidden transition-all-600"
:class="showTopSearch ? 'w-220px ml2' : 'w-0'"
@change="handleChange"
>
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
2023-05-29 11:05:46 +08:00
</template>
2023-06-21 19:35:11 +08:00
<script lang="ts" setup>
defineProps({
isModal: {
type: Boolean,
default: true
}
})
2023-05-29 11:05:46 +08:00
const router = useRouter() // 路由对象
const showSearch = ref(false) // 是否显示弹框
const showTopSearch = ref(false) // 是否显示顶部搜索框
2023-05-29 11:26:51 +08:00
const value: Ref = ref('') // 用户输入的值
2023-05-29 11:05:46 +08:00
const routers = router.getRoutes() // 路由对象
2023-05-29 11:26:51 +08:00
const options = computed(() => {
// 提示选项
if (!value.value) {
return []
}
const list = routers.filter((item: any) => {
if (item.meta.title?.indexOf(value.value) > -1 || item.path.indexOf(value.value) > -1) {
return true
2023-05-29 11:05:46 +08:00
}
2023-05-29 11:26:51 +08:00
})
return list.map((item) => {
return {
label: `${item.meta.title}${item.path}`,
value: item.path
}
})
2023-05-29 11:05:46 +08:00
})
function remoteMethod(data) {
2023-05-29 11:26:51 +08:00
// 这里可以执行相应的操作(例如打开搜索框等)
value.value = data
2023-05-29 11:05:46 +08:00
}
function handleChange(path) {
2023-05-29 11:26:51 +08:00
router.push({ path })
hiddenTopSearch();
}
function hiddenTopSearch() {
showTopSearch.value = false
2023-05-29 11:05:46 +08:00
}
onMounted(() => {
2023-05-29 11:26:51 +08:00
window.addEventListener('keydown', listenKey)
window.addEventListener('click', hiddenTopSearch)
2023-05-29 11:05:46 +08:00
})
onUnmounted(() => {
2023-05-29 11:26:51 +08:00
window.removeEventListener('keydown', listenKey)
window.removeEventListener('click', hiddenTopSearch)
2023-05-29 11:05:46 +08:00
})
// 监听 ctrl + k
function listenKey(event) {
2023-05-29 11:26:51 +08:00
if ((event.ctrlKey || event.metaKey) && event.key === 'k') {
showSearch.value = !showSearch.value
// 这里可以执行相应的操作(例如打开搜索框等)
}
2023-05-29 11:05:46 +08:00
}
defineExpose({
2023-05-29 11:26:51 +08:00
openSearch: () => {
showSearch.value = true
}
2023-05-29 11:05:46 +08:00
})
2023-05-29 11:26:51 +08:00
</script>