custom-node.vue 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <template>
  2. <el-tree-v2 :data="data" :props="props" :height="208">
  3. <template #default="{ node }">
  4. <span class="prefix" :class="{ 'is-leaf': node.isLeaf }">[ElementPlus]</span>
  5. <span>{{ node.label }}</span>
  6. </template>
  7. </el-tree-v2>
  8. </template>
  9. <script lang="ts" setup>
  10. interface Tree {
  11. id: string
  12. label: string
  13. children?: Tree[]
  14. }
  15. const getKey = (prefix: string, id: number) => {
  16. return `${prefix}-${id}`
  17. }
  18. const createData = (maxDeep: number, maxChildren: number, minNodesNumber: number, deep = 1, key = 'node'): Tree[] => {
  19. let id = 0
  20. return Array.from({ length: minNodesNumber })
  21. .fill(deep)
  22. .map(() => {
  23. const childrenNumber = deep === maxDeep ? 0 : Math.round(Math.random() * maxChildren)
  24. const nodeKey = getKey(key, ++id)
  25. return {
  26. id: nodeKey,
  27. label: nodeKey,
  28. children: childrenNumber ? createData(maxDeep, maxChildren, childrenNumber, deep + 1, nodeKey) : undefined,
  29. }
  30. })
  31. }
  32. const props = {
  33. value: 'id',
  34. label: 'label',
  35. children: 'children',
  36. }
  37. const data = createData(4, 30, 40)
  38. </script>
  39. <style scoped>
  40. .prefix {
  41. color: var(--el-color-primary);
  42. margin-right: 10px;
  43. }
  44. .prefix.is-leaf {
  45. color: var(--el-color-success);
  46. }
  47. </style>