Skip to content

Commit 6768cde

Browse files
author
wangding
committed
新增路由搜索功能
1 parent 9f0065f commit 6768cde

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

src/App.vue

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { isDark } from '@/utils/is'
33
import { useAppStore } from '@/store/modules/app'
44
import { useDesign } from '@/hooks/web/useDesign'
55
import { CACHE_KEY, useCache } from '@/hooks/web/useCache'
6+
import routerSearch from '@/components/RouterSearch'
7+
68
79
const { getPrefixCls } = useDesign()
810
const prefixCls = getPrefixCls('app')
@@ -24,6 +26,7 @@ setDefaultTheme()
2426
<template>
2527
<ConfigGlobal :size="currentSize">
2628
<RouterView :class="greyMode ? `${prefixCls}-grey-mode` : ''" />
29+
<routerSearch/>
2730
</ConfigGlobal>
2831
</template>
2932
<style lang="scss">

src/components/RouterSearch/index.vue

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<template>
2+
<ElDialog v-model="showSearch" :show-close="false" title="菜单搜索">
3+
<el-select
4+
filterable
5+
:reserve-keyword="false"
6+
remote
7+
placeholder="请输入菜单内容"
8+
:remote-method="remoteMethod"
9+
style="width: 100%;"
10+
@change="handleChange"
11+
>
12+
<el-option
13+
v-for="item in options"
14+
:key="item.value"
15+
:label="item.label"
16+
:value="item.value"
17+
/>
18+
</el-select>
19+
</ElDialog>
20+
</template>
21+
22+
<script setup lang="ts">
23+
const router = useRouter() // 路由对象
24+
const showSearch = ref(false) // 是否显示弹框
25+
const value:Ref = ref('') // 用户输入的值
26+
27+
const routers = router.getRoutes() // 路由对象
28+
const options = computed(() => { // 提示选项
29+
if(!value.value) {
30+
return []
31+
}
32+
const list = routers.filter((item:any) => {
33+
if(item.meta.title?.indexOf(value.value) > -1 || item.path.indexOf(value.value) > -1) {
34+
return true
35+
}
36+
})
37+
return list.map((item) => {
38+
return {
39+
label: `${item.meta.title}${item.path}`,
40+
value: item.path
41+
}
42+
})
43+
})
44+
45+
46+
function remoteMethod(data) {
47+
// 这里可以执行相应的操作(例如打开搜索框等)
48+
value.value = data
49+
}
50+
51+
function handleChange(path) {
52+
router.push({path})
53+
}
54+
55+
onMounted(() => {
56+
window.addEventListener('keydown', listenKey)
57+
})
58+
59+
onUnmounted(() => {
60+
window.removeEventListener('keydown', listenKey)
61+
})
62+
63+
// 监听 ctrl + k
64+
function listenKey(event) {
65+
if ((event.ctrlKey || event.metaKey) && event.key === 'k') {
66+
showSearch.value = !showSearch.value
67+
// 这里可以执行相应的操作(例如打开搜索框等)
68+
}
69+
}
70+
71+
defineExpose({
72+
openSearch: () => {
73+
showSearch.value = true
74+
}
75+
})
76+
</script>

0 commit comments

Comments
 (0)