fileSystem.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. // const pid = node.pid;
  61. // if (pid && !node.children) {
  62. // const parent = findParent(pid, props.list);
  63. // parent.splice(
  64. // parent.findIndex((item) => item.id == node.id),
  65. // 1
  66. // );
  67. // }
  68. // else {
  69. // props.list.splice(
  70. // props.list.findIndex((item) => item.id == node.id),
  71. // 1
  72. // );
  73. // }
  74. emit('deleteNode', {
  75. ...node,
  76. eventType: 'delete',
  77. });
  78. };
  79. // // 添加
  80. // const onAddNode = (node) => {
  81. // console.log(node);
  82. // };
  83. // 拖拽
  84. const drop = (node) => {
  85. const pid = compInOperation.value.pid;
  86. if (pid) {
  87. const parent: any = findParent(pid, props.list);
  88. parent.splice(
  89. parent.findIndex((item) => item.id == compInOperation.value.id),
  90. 1
  91. );
  92. } else {
  93. props.list.splice(
  94. props.list.findIndex((item) => item.id == compInOperation.value.id),
  95. 1
  96. );
  97. }
  98. console.log(node);
  99. if (node.isFolder) {
  100. compInOperation.value.pid = node.id;
  101. node.children.push(compInOperation.value);
  102. } else {
  103. compInOperation.value.pid = null;
  104. props.list.push(compInOperation.value);
  105. }
  106. emit('onDrop', {
  107. target: node,
  108. node: compInOperation.value,
  109. });
  110. };
  111. // // 添加文件
  112. // const onAddFolder = (node) => {
  113. // console.log(node);
  114. // };
  115. // 拖拽开始选中node
  116. const dragStart = (node) => {
  117. compInOperation.value = node;
  118. };
  119. </script>
  120. <style scoped></style>