fileSystem.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <template>
  2. <treeList
  3. v-for="model in list"
  4. v-bind="$attrs"
  5. :model="model"
  6. :key="model.id"
  7. @delete-node="onDeltet"
  8. @add-node="onAddNode"
  9. @on-drop="drop"
  10. @add-folder="onAddFolder"
  11. @dragStart="dragStart"
  12. >
  13. <template #icon="slotProps">
  14. <slot name="icon" v-bind="slotProps"></slot>
  15. </template>
  16. <template #operation="slotProps">
  17. <slot name="operation" v-bind="slotProps"></slot>
  18. </template>
  19. </treeList>
  20. </template>
  21. <script setup lang="ts">
  22. import { ref } from 'vue';
  23. import treeList from './treeList.vue';
  24. const emit = defineEmits(['onDrop', 'deleteNode']);
  25. interface IFileSystem {
  26. id: string;
  27. title: string;
  28. pid: string;
  29. isFolder: boolean;
  30. isAdd: boolean;
  31. children?: IFileSystem[];
  32. }
  33. const compInOperation = ref(null);
  34. const props = withDefaults(
  35. defineProps<{
  36. list: IFileSystem[];
  37. }>(),
  38. {}
  39. );
  40. // 递归寻找父组件
  41. function findParent(pid, Tree) {
  42. let targetNode = null;
  43. function find(item, flattenTree) {
  44. flattenTree.find((ele) => {
  45. if (ele.id == pid) {
  46. targetNode = ele;
  47. return true;
  48. } else {
  49. if (ele.children) {
  50. find(pid, ele.children);
  51. }
  52. }
  53. });
  54. }
  55. find(pid, Tree);
  56. return targetNode.children;
  57. }
  58. // 删除
  59. const onDeltet = (node) => {
  60. console.log(node,'shanchu')
  61. const pid = node.pid;
  62. if (pid && !node.children) {
  63. const parent = findParent(pid, props.list);
  64. parent.splice(
  65. parent.findIndex((item) => item.id == node.id),
  66. 1
  67. );
  68. }
  69. // else {
  70. // props.list.splice(
  71. // props.list.findIndex((item) => item.id == node.id),
  72. // 1
  73. // );
  74. // }
  75. emit('deleteNode', {
  76. ...node,
  77. eventType: 'delete',
  78. });
  79. };
  80. // // 添加
  81. // const onAddNode = (node) => {
  82. // console.log(node);
  83. // };
  84. // 拖拽
  85. const drop = (node) => {
  86. const pid = compInOperation.value.pid;
  87. if (pid) {
  88. const parent: any = findParent(pid, props.list);
  89. parent.splice(
  90. parent.findIndex((item) => item.id == compInOperation.value.id),
  91. 1
  92. );
  93. } else {
  94. props.list.splice(
  95. props.list.findIndex((item) => item.id == compInOperation.value.id),
  96. 1
  97. );
  98. }
  99. console.log(node);
  100. if (node.isFolder) {
  101. compInOperation.value.pid = node.id;
  102. node.children.push(compInOperation.value);
  103. } else {
  104. compInOperation.value.pid = null;
  105. props.list.push(compInOperation.value);
  106. }
  107. emit('onDrop', {
  108. target: node,
  109. node: compInOperation.value,
  110. });
  111. };
  112. // // 添加文件
  113. // const onAddFolder = (node) => {
  114. // console.log(node);
  115. // };
  116. // 拖拽开始选中node
  117. const dragStart = (node) => {
  118. compInOperation.value = node;
  119. };
  120. </script>
  121. <style scoped></style>