custom-node.vue 1.3 KB

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