index.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. <script setup lang="ts">
  22. const router = useRouter() // 路由对象
  23. const showSearch = ref(false) // 是否显示弹框
  24. const value:Ref = ref('') // 用户输入的值
  25. const routers = router.getRoutes() // 路由对象
  26. const options = computed(() => { // 提示选项
  27. if(!value.value) {
  28. return []
  29. }
  30. const list = routers.filter((item:any) => {
  31. if(item.meta.title?.indexOf(value.value) > -1 || item.path.indexOf(value.value) > -1) {
  32. return true
  33. }
  34. })
  35. return list.map((item) => {
  36. return {
  37. label: `${item.meta.title}${item.path}`,
  38. value: item.path
  39. }
  40. })
  41. })
  42. function remoteMethod(data) {
  43. // 这里可以执行相应的操作(例如打开搜索框等)
  44. value.value = data
  45. }
  46. function handleChange(path) {
  47. router.push({path})
  48. }
  49. onMounted(() => {
  50. window.addEventListener('keydown', listenKey)
  51. })
  52. onUnmounted(() => {
  53. window.removeEventListener('keydown', listenKey)
  54. })
  55. // 监听 ctrl + k
  56. function listenKey(event) {
  57. if ((event.ctrlKey || event.metaKey) && event.key === 'k') {
  58. showSearch.value = !showSearch.value
  59. // 这里可以执行相应的操作(例如打开搜索框等)
  60. }
  61. }
  62. defineExpose({
  63. openSearch: () => {
  64. showSearch.value = true
  65. }
  66. })
  67. </script>