houzhongjian
2024-08-08 820397e43a0b64d35c6d31d2a55475061438593b
提交 | 用户 | 时间
820397 1 <template>
H 2   <ElDialog v-if="isModal" 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   <div v-else class="custom-hover" @click.stop="showTopSearch = !showTopSearch">
21     <Icon icon="ep:search" />
22     <el-select
23       filterable
24       :reserve-keyword="false"
25       remote
26       placeholder="请输入菜单内容"
27       :remote-method="remoteMethod"
28       class="overflow-hidden transition-all-600"
29       :class="showTopSearch ? '!w-220px ml2' : '!w-0'"
30       @change="handleChange"
31     >
32       <el-option
33         v-for="item in options"
34         :key="item.value"
35         :label="item.label"
36         :value="item.value"
37       />
38     </el-select>
39   </div>
40 </template>
41
42 <script lang="ts" setup>
43 defineProps({
44   isModal: {
45     type: Boolean,
46     default: true
47   }
48 })
49
50 const router = useRouter() // 路由对象
51 const showSearch = ref(false) // 是否显示弹框
52 const showTopSearch = ref(false) // 是否显示顶部搜索框
53 const value: Ref = ref('') // 用户输入的值
54
55 const routers = router.getRoutes() // 路由对象
56 const options = computed(() => {
57   // 提示选项
58   if (!value.value) {
59     return []
60   }
61   const list = routers.filter((item: any) => {
62     if (item.meta.title?.indexOf(value.value) > -1 || item.path.indexOf(value.value) > -1) {
63       return true
64     }
65   })
66   return list.map((item) => {
67     return {
68       label: `${item.meta.title}${item.path}`,
69       value: item.path
70     }
71   })
72 })
73
74 function remoteMethod(data) {
75   // 这里可以执行相应的操作(例如打开搜索框等)
76   value.value = data
77 }
78
79 function handleChange(path) {
80   router.push({ path })
81   hiddenTopSearch()
82 }
83
84 function hiddenTopSearch() {
85   showTopSearch.value = false
86 }
87
88 onMounted(() => {
89   window.addEventListener('keydown', listenKey)
90   window.addEventListener('click', hiddenTopSearch)
91 })
92
93 onUnmounted(() => {
94   window.removeEventListener('keydown', listenKey)
95   window.removeEventListener('click', hiddenTopSearch)
96 })
97
98 // 监听 ctrl + k
99 function listenKey(event) {
100   if ((event.ctrlKey || event.metaKey) && event.key === 'k') {
101     showSearch.value = !showSearch.value
102     // 这里可以执行相应的操作(例如打开搜索框等)
103   }
104 }
105
106 defineExpose({
107   openSearch: () => {
108     showSearch.value = true
109   }
110 })
111 </script>