menu-tree.vue 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <script lang="ts">
  2. export default {
  3. name: "reMenuTree"
  4. };
  5. </script>
  6. <script setup lang="ts">
  7. import { ref, computed } from "vue";
  8. import type { ElTreeV2 } from "element-plus";
  9. import { transformI18n } from "/@/plugins/i18n";
  10. import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
  11. import { extractPathList, deleteChildren } from "/@/utils/tree";
  12. import { usePermissionStoreHook } from "/@/store/modules/permission";
  13. import type { TreeNode } from "element-plus/es/components/tree-v2/src/types";
  14. interface treeNode extends TreeNode {
  15. meta: {
  16. title: string;
  17. };
  18. }
  19. const query = ref("");
  20. let dataProps = ref({
  21. value: "uniqueId",
  22. children: "children"
  23. });
  24. const treeRef = ref<InstanceType<typeof ElTreeV2>>();
  25. let menusData = computed(() => {
  26. return deleteChildren(usePermissionStoreHook().menusTree);
  27. });
  28. let expandedKeys = extractPathList(menusData.value);
  29. const onQueryChanged = (query: string) => {
  30. // @ts-expect-error
  31. treeRef.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>
  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('node-tree')"
  47. style="font-size: 16px; margin: 0 5px 4px 0"
  48. >
  49. Tree V2
  50. </el-link>
  51. 组件并支持国际化)
  52. </span>
  53. </div>
  54. </template>
  55. <el-input
  56. class="mb-4"
  57. v-model="query"
  58. placeholder="请输入关键字查找"
  59. clearable
  60. @input="onQueryChanged"
  61. />
  62. <el-tree-v2
  63. ref="treeRef"
  64. :data="menusData"
  65. :props="dataProps"
  66. show-checkbox
  67. :height="500"
  68. :filter-method="filterMethod"
  69. :default-expanded-keys="expandedKeys"
  70. >
  71. <template #default="{ data }">
  72. <span>{{ transformI18n(data.meta.title) }}</span>
  73. </template>
  74. </el-tree-v2>
  75. </el-card>
  76. </template>