menu-tree.vue 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. <script setup lang="ts">
  2. import { ref, computed } from "vue";
  3. import { clone } from "@pureadmin/utils";
  4. import type { ElTreeV2 } from "element-plus";
  5. import { transformI18n } from "@/plugins/i18n";
  6. import { useRenderIcon } from "@/components/ReIcon/src/hooks";
  7. import { extractPathList, deleteChildren } from "@/utils/tree";
  8. import { usePermissionStoreHook } from "@/store/modules/permission";
  9. import type { TreeNode } from "element-plus/es/components/tree-v2/src/types";
  10. import NodeTree from "~icons/ri/node-tree";
  11. defineOptions({
  12. name: "MenuTree"
  13. });
  14. interface treeNode extends TreeNode {
  15. meta: {
  16. title: string;
  17. };
  18. }
  19. const query = ref("");
  20. const dataProps = ref({
  21. value: "uniqueId",
  22. children: "children"
  23. });
  24. const treeRef = ref<InstanceType<typeof ElTreeV2>>();
  25. const menusTree = clone(usePermissionStoreHook().wholeMenus, true);
  26. const menusData = computed(() => {
  27. return deleteChildren(menusTree);
  28. });
  29. const expandedKeys = extractPathList(menusData.value);
  30. const onQueryChanged = (query: string) => {
  31. (treeRef as any).value!.filter(query);
  32. };
  33. const filterMethod = (query: string, node: treeNode) => {
  34. return transformI18n(node.meta.title)!.indexOf(query) !== -1;
  35. };
  36. </script>
  37. <template>
  38. <el-card shadow="never">
  39. <template #header>
  40. <div class="card-header">
  41. <span class="font-medium">
  42. 菜单树结构(采用 Element Plus 的
  43. <el-link
  44. href="https://element-plus.gitee.io/zh-CN/component/tree-v2.html"
  45. target="_blank"
  46. :icon="useRenderIcon(NodeTree)"
  47. style="margin: 0 5px 4px 0; font-size: 16px"
  48. >
  49. Tree V2
  50. </el-link>
  51. 组件并支持国际化)
  52. </span>
  53. </div>
  54. <el-link
  55. class="mt-2"
  56. href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/menu-tree.vue"
  57. target="_blank"
  58. >
  59. 代码位置 src/views/able/menu-tree.vue
  60. </el-link>
  61. </template>
  62. <el-input
  63. v-model="query"
  64. class="mb-4"
  65. placeholder="请输入关键字查找"
  66. clearable
  67. @input="onQueryChanged"
  68. />
  69. <el-tree-v2
  70. ref="treeRef"
  71. :data="menusData"
  72. :props="dataProps"
  73. show-checkbox
  74. :height="500"
  75. :filter-method="filterMethod"
  76. :default-expanded-keys="expandedKeys"
  77. >
  78. <template #default="{ data }">
  79. <span>{{ transformI18n(data.meta.title) }}</span>
  80. </template>
  81. </el-tree-v2>
  82. </el-card>
  83. </template>