line-tree.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. <script setup lang="ts">
  2. import { computed } from "vue";
  3. import { clone } from "@pureadmin/utils";
  4. import { transformI18n } from "@/plugins/i18n";
  5. import ElTreeLine from "@/components/ReTreeLine";
  6. import { extractPathList, deleteChildren } from "@/utils/tree";
  7. import { usePermissionStoreHook } from "@/store/modules/permission";
  8. defineOptions({
  9. name: "LineTree"
  10. });
  11. const menusTree = clone(usePermissionStoreHook().wholeMenus, true);
  12. const menusData = computed(() => {
  13. return deleteChildren(menusTree);
  14. });
  15. const expandedKeys = extractPathList(menusData.value);
  16. const dataProps = {
  17. value: "uniqueId",
  18. children: "children"
  19. };
  20. </script>
  21. <template>
  22. <el-card shadow="never">
  23. <template #header>
  24. <div class="card-header">
  25. <span class="font-medium">
  26. 扩展elemenet-plus的树形组件包括虚拟树组件,支持连接线
  27. </span>
  28. </div>
  29. </template>
  30. <el-row :gutter="24">
  31. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" class="mb-[20px]">
  32. <el-card shadow="never">
  33. <template #header>
  34. <div class="card-header">
  35. <span class="font-medium"> 普通树结构 </span>
  36. </div>
  37. </template>
  38. <div class="max-h-[550px] overflow-y-auto">
  39. <el-tree
  40. :data="menusData"
  41. :props="dataProps"
  42. show-checkbox
  43. default-expand-all
  44. node-key="uniqueId"
  45. :indent="30"
  46. ><template v-slot:default="{ node }">
  47. <el-tree-line :node="node" :showLabelLine="true">
  48. <template v-slot:node-label>
  49. <span class="text-sm">
  50. {{ transformI18n(node.data.meta.title) }}
  51. </span>
  52. </template>
  53. </el-tree-line>
  54. </template>
  55. </el-tree>
  56. </div>
  57. </el-card>
  58. </el-col>
  59. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  60. <el-card shadow="never">
  61. <template #header>
  62. <div class="card-header">
  63. <span class="font-medium"> 虚拟树结构 </span>
  64. </div>
  65. </template>
  66. <div class="max-h-[550px] overflow-y-auto">
  67. <el-tree-v2
  68. :data="menusData"
  69. :props="dataProps"
  70. show-checkbox
  71. :height="550"
  72. :default-expanded-keys="expandedKeys"
  73. >
  74. <template v-slot:default="{ node }">
  75. <el-tree-line
  76. :node="node"
  77. :treeData="menusData"
  78. :showLabelLine="true"
  79. :indent="30"
  80. >
  81. <template v-slot:node-label>
  82. <span class="text-sm">
  83. {{ transformI18n(node.data.meta.title) }}
  84. </span>
  85. </template>
  86. </el-tree-line>
  87. </template>
  88. </el-tree-v2>
  89. </div>
  90. </el-card>
  91. </el-col>
  92. </el-row>
  93. </el-card>
  94. </template>