selectable.vue 1.1 KB

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