index.vue 1.7 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. // 提示选项
  28. if (!value.value) {
  29. return []
  30. }
  31. const list = routers.filter((item: any) => {
  32. if (item.meta.title?.indexOf(value.value) > -1 || item.path.indexOf(value.value) > -1) {
  33. return true
  34. }
  35. })
  36. return list.map((item) => {
  37. return {
  38. label: `${item.meta.title}${item.path}`,
  39. value: item.path
  40. }
  41. })
  42. })
  43. function remoteMethod(data) {
  44. // 这里可以执行相应的操作(例如打开搜索框等)
  45. value.value = data
  46. }
  47. function handleChange(path) {
  48. router.push({ path })
  49. }
  50. onMounted(() => {
  51. window.addEventListener('keydown', listenKey)
  52. })
  53. onUnmounted(() => {
  54. window.removeEventListener('keydown', listenKey)
  55. })
  56. // 监听 ctrl + k
  57. function listenKey(event) {
  58. if ((event.ctrlKey || event.metaKey) && event.key === 'k') {
  59. showSearch.value = !showSearch.value
  60. // 这里可以执行相应的操作(例如打开搜索框等)
  61. }
  62. }
  63. defineExpose({
  64. openSearch: () => {
  65. showSearch.value = true
  66. }
  67. })
  68. </script>