index.vue 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <template>
  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. <script lang="ts" setup>
  42. defineProps({
  43. isModal: {
  44. type: Boolean,
  45. default: true
  46. }
  47. })
  48. const router = useRouter() // 路由对象
  49. const showSearch = ref(false) // 是否显示弹框
  50. const showTopSearch = ref(false) // 是否显示顶部搜索框
  51. const value: Ref = ref('') // 用户输入的值
  52. const routers = router.getRoutes() // 路由对象
  53. const options = computed(() => {
  54. // 提示选项
  55. if (!value.value) {
  56. return []
  57. }
  58. const list = routers.filter((item: any) => {
  59. if (item.meta.title?.indexOf(value.value) > -1 || item.path.indexOf(value.value) > -1) {
  60. return true
  61. }
  62. })
  63. return list.map((item) => {
  64. return {
  65. label: `${item.meta.title}${item.path}`,
  66. value: item.path
  67. }
  68. })
  69. })
  70. function remoteMethod(data) {
  71. // 这里可以执行相应的操作(例如打开搜索框等)
  72. value.value = data
  73. }
  74. function handleChange(path) {
  75. router.push({ path })
  76. hiddenTopSearch()
  77. }
  78. function hiddenTopSearch() {
  79. showTopSearch.value = false
  80. }
  81. onMounted(() => {
  82. window.addEventListener('keydown', listenKey)
  83. window.addEventListener('click', hiddenTopSearch)
  84. })
  85. onUnmounted(() => {
  86. window.removeEventListener('keydown', listenKey)
  87. window.removeEventListener('click', hiddenTopSearch)
  88. })
  89. // 监听 ctrl + k
  90. function listenKey(event) {
  91. if ((event.ctrlKey || event.metaKey) && event.key === 'k') {
  92. showSearch.value = !showSearch.value
  93. // 这里可以执行相应的操作(例如打开搜索框等)
  94. }
  95. }
  96. defineExpose({
  97. openSearch: () => {
  98. showSearch.value = true
  99. }
  100. })
  101. </script>