line-tree.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. <p class="font-medium">
  26. 扩展 Elemenet Plus 的树形组件包括虚拟树组件,支持连接线
  27. </p>
  28. <el-link
  29. class="mt-2"
  30. href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/line-tree.vue"
  31. target="_blank"
  32. >
  33. 代码位置 src/views/able/line-tree.vue
  34. </el-link>
  35. </div>
  36. </template>
  37. <el-row :gutter="24">
  38. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" class="mb-[20px]">
  39. <el-card shadow="never">
  40. <template #header>
  41. <div class="card-header">普通树结构</div>
  42. </template>
  43. <div class="max-h-[550px] overflow-y-auto">
  44. <el-tree
  45. :data="menusData"
  46. :props="dataProps"
  47. show-checkbox
  48. default-expand-all
  49. node-key="uniqueId"
  50. :indent="30"
  51. ><template v-slot:default="{ node }">
  52. <el-tree-line :node="node" :showLabelLine="true">
  53. <template v-slot:node-label>
  54. <span class="text-sm">
  55. {{ transformI18n(node.data.meta.title) }}
  56. </span>
  57. </template>
  58. </el-tree-line>
  59. </template>
  60. </el-tree>
  61. </div>
  62. </el-card>
  63. </el-col>
  64. <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
  65. <el-card shadow="never">
  66. <template #header>
  67. <div class="card-header">虚拟树结构</div>
  68. </template>
  69. <div class="max-h-[550px] overflow-y-auto">
  70. <el-tree-v2
  71. :data="menusData"
  72. :props="dataProps"
  73. show-checkbox
  74. :height="550"
  75. :default-expanded-keys="expandedKeys"
  76. >
  77. <template v-slot:default="{ node }">
  78. <el-tree-line
  79. :node="node"
  80. :treeData="menusData"
  81. :showLabelLine="true"
  82. :indent="30"
  83. >
  84. <template v-slot:node-label>
  85. <span class="text-sm">
  86. {{ transformI18n(node.data.meta.title) }}
  87. </span>
  88. </template>
  89. </el-tree-line>
  90. </template>
  91. </el-tree-v2>
  92. </div>
  93. </el-card>
  94. </el-col>
  95. </el-row>
  96. </el-card>
  97. </template>