draggable.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. <template>
  2. <el-tree
  3. :allow-drop="allowDrop"
  4. :allow-drag="allowDrag"
  5. :data="data"
  6. draggable
  7. default-expand-all
  8. node-key="id"
  9. @node-drag-start="handleDragStart"
  10. @node-drag-enter="handleDragEnter"
  11. @node-drag-leave="handleDragLeave"
  12. @node-drag-over="handleDragOver"
  13. @node-drag-end="handleDragEnd"
  14. @node-drop="handleDrop"
  15. />
  16. </template>
  17. <script lang="ts" setup>
  18. import type Node from 'element-plus/es/components/tree/src/model/node'
  19. import type { DragEvents } from 'element-plus/es/components/tree/src/model/useDragNode'
  20. import type {
  21. AllowDropType,
  22. NodeDropType,
  23. } from 'element-plus/es/components/tree/src/tree.type'
  24. const handleDragStart = (node: Node, ev: DragEvents) => {
  25. console.log('drag start', node)
  26. }
  27. const handleDragEnter = (
  28. draggingNode: Node,
  29. dropNode: Node,
  30. ev: DragEvents
  31. ) => {
  32. console.log('tree drag enter:', dropNode.label)
  33. }
  34. const handleDragLeave = (
  35. draggingNode: Node,
  36. dropNode: Node,
  37. ev: DragEvents
  38. ) => {
  39. console.log('tree drag leave:', dropNode.label)
  40. }
  41. const handleDragOver = (draggingNode: Node, dropNode: Node, ev: DragEvents) => {
  42. console.log('tree drag over:', dropNode.label)
  43. }
  44. const handleDragEnd = (
  45. draggingNode: Node,
  46. dropNode: Node,
  47. dropType: NodeDropType,
  48. ev: DragEvents
  49. ) => {
  50. console.log('tree drag end:', dropNode && dropNode.label, dropType)
  51. }
  52. const handleDrop = (
  53. draggingNode: Node,
  54. dropNode: Node,
  55. dropType: NodeDropType,
  56. ev: DragEvents
  57. ) => {
  58. console.log('tree drop:', dropNode.label, dropType)
  59. }
  60. const allowDrop = (draggingNode: Node, dropNode: Node, type: AllowDropType) => {
  61. if (dropNode.data.label === 'Level two 3-1') {
  62. return type !== 'inner'
  63. } else {
  64. return true
  65. }
  66. }
  67. const allowDrag = (draggingNode: Node) => {
  68. return !draggingNode.data.label.includes('Level three 3-1-1')
  69. }
  70. const data = [
  71. {
  72. label: 'Level one 1',
  73. children: [
  74. {
  75. label: 'Level two 1-1',
  76. children: [
  77. {
  78. label: 'Level three 1-1-1',
  79. },
  80. ],
  81. },
  82. ],
  83. },
  84. {
  85. label: 'Level one 2',
  86. children: [
  87. {
  88. label: 'Level two 2-1',
  89. children: [
  90. {
  91. label: 'Level three 2-1-1',
  92. },
  93. ],
  94. },
  95. {
  96. label: 'Level two 2-2',
  97. children: [
  98. {
  99. label: 'Level three 2-2-1',
  100. },
  101. ],
  102. },
  103. ],
  104. },
  105. {
  106. label: 'Level one 3',
  107. children: [
  108. {
  109. label: 'Level two 3-1',
  110. children: [
  111. {
  112. label: 'Level three 3-1-1',
  113. },
  114. ],
  115. },
  116. {
  117. label: 'Level two 3-2',
  118. children: [
  119. {
  120. label: 'Level three 3-2-1',
  121. },
  122. ],
  123. },
  124. ],
  125. },
  126. ]
  127. </script>