selectable.vue 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. <template>
  2. <el-tree :props="props" :load="loadNode" lazy show-checkbox @check-change="handleCheckChange" />
  3. </template>
  4. <script lang="ts" setup>
  5. import type Node from 'element-plus/es/components/tree/src/model/node'
  6. let count = 1
  7. interface Tree {
  8. name: string
  9. }
  10. const props = {
  11. label: 'name',
  12. children: 'zones',
  13. }
  14. const handleCheckChange = (data: Tree, checked: boolean, indeterminate: boolean) => {
  15. console.log(data, checked, indeterminate)
  16. }
  17. const loadNode = (node: Node, resolve: (data: Tree[]) => void) => {
  18. if (node.level === 0) {
  19. return resolve([{ name: 'Root1' }, { name: 'Root2' }])
  20. }
  21. if (node.level > 3) return resolve([])
  22. let hasChild = false
  23. if (node.data.name === 'region1') {
  24. hasChild = true
  25. } else if (node.data.name === 'region2') {
  26. hasChild = false
  27. } else {
  28. hasChild = Math.random() > 0.5
  29. }
  30. setTimeout(() => {
  31. let data: Tree[] = []
  32. if (hasChild) {
  33. data = [
  34. {
  35. name: `zone${count++}`,
  36. },
  37. {
  38. name: `zone${count++}`,
  39. },
  40. ]
  41. } else {
  42. data = []
  43. }
  44. resolve(data)
  45. }, 500)
  46. }
  47. </script>