EditableTree.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <template>
  2. <div class="editableTree fsize-m4">
  3. <div class="editableTree-filter" v-show="needTextFilter">
  4. <el-input
  5. placeholder="输入关键字进行过滤"
  6. v-model="filterText">
  7. </el-input>
  8. </div>
  9. <div class="wrap-tree">
  10. <el-tree
  11. :data="newData"
  12. :node-key="nodeKey"
  13. :default-expanded-keys="stDefaultExpandedKeys"
  14. @node-drag-start="handleDragStart"
  15. @node-drag-enter="handleDragEnter"
  16. @node-drag-leave="handleDragLeave"
  17. @node-drag-over="handleDragOver"
  18. @node-drag-end="handleDragEnd"
  19. @node-drop="handleDrop"
  20. @node-click="handleNodeClick"
  21. @node-expand="handleNodeExpand"
  22. @node-collapse="handleNodeCollapse"
  23. :allow-drop="allowDrop"
  24. :draggable="treeDraggable"
  25. :expand-on-click-node="false"
  26. ref="tree"
  27. :filter-node-method="filterNode"
  28. :highlight-current="true"
  29. >
  30. <div class="custom-tree-node" slot-scope="{ node, data }">
  31. <editor-tree-item
  32. :node="node"
  33. :data="data"
  34. :needControl="isControl"
  35. @labelClick="handleLabelClick"
  36. @treeItemAppend="treeAppend"
  37. @treeItemRemove="treeRemove"
  38. @changeDragState="changeDragState"
  39. @treeItemEditor="getTreeItemEditor">
  40. </editor-tree-item>
  41. </div>
  42. </el-tree>
  43. </div>
  44. </div>
  45. </template>
  46. <script>
  47. import EditorTreeItem from '@/components/management/Layout/EditableTree/EditableTreeItem.vue';
  48. import { mapGetters } from 'vuex';
  49. export default {
  50. name: 'EditableTree',
  51. components: {
  52. EditorTreeItem,
  53. },
  54. props: {
  55. newData: {
  56. // 树的数据
  57. type: Array,
  58. default: () => arr,
  59. },
  60. allowDropStatue: {
  61. // 是否允许设置拖拽
  62. type: Boolean,
  63. default: false,
  64. },
  65. isDraggable: {
  66. type: Boolean,
  67. default: true,
  68. },
  69. needTextFilter: {
  70. type: Boolean,
  71. default: false,
  72. },
  73. isControl: {
  74. type: Boolean,
  75. default: true,
  76. },
  77. nodeKey: {
  78. type: String,
  79. default: 'id',
  80. },
  81. expandedKeys: {
  82. // 树的数据
  83. type: Array,
  84. default: () => [],
  85. },
  86. },
  87. data() {
  88. return {
  89. input: '',
  90. startData: '',
  91. showItem: true,
  92. treeDraggable: this.isDraggable,
  93. filterText: '',
  94. currentNodekey: '',
  95. stDefaultExpandedKeys: [],
  96. };
  97. },
  98. methods: {
  99. filterNode(value, data) {
  100. if (!value) {
  101. return true;
  102. }
  103. return data.lable.indexOf(value) !== -1;
  104. },
  105. handleLabelClick(data) {
  106. this.$refs.tree.setCurrentKey(data.data.id);
  107. this.$emit('handleClick', data);
  108. },
  109. setCurrentKey(id) {
  110. this.$refs.tree.setCurrentKey(id);
  111. },
  112. handleNodeClick(data, Node, self) {
  113. /*const opt = {data, Node, self};
  114. this.$emit('handleClick', opt);*/
  115. },
  116. handleNodeExpand(data) {
  117. this.$emit('syncExpandedKeys', {
  118. data: data,
  119. isExpand: true,
  120. });
  121. },
  122. handleNodeCollapse(data) {
  123. this.$emit('syncExpandedKeys', {
  124. data: data,
  125. isExpand: false,
  126. });
  127. },
  128. handleDragStart(node, ev) {
  129. this.startData = node;
  130. },
  131. handleDragEnter(draggingNode, dropNode, ev) {
  132. },
  133. handleDragLeave(draggingNode, dropNode, ev) {
  134. },
  135. handleDragOver(draggingNode, dropNode, ev) {
  136. },
  137. handleDragEnd(draggingNode, dropNode, dropType, ev) {
  138. },
  139. // 拖拽放置时触发
  140. handleDrop(draggingNode, dropNode, dropType, ev) {
  141. this.$emit('handleDrop', dropNode, draggingNode, dropType, ev, this.startData);
  142. },
  143. // 是否允许拖拽
  144. allowDrop(draggingNode, dropNode, dropType) {
  145. const c = dropType !== 'prev' && dropType !== 'next';
  146. if (!c && dropNode.data.lable === this.newData[0].lable && this.allowDropStatue) {
  147. return false;
  148. } else {
  149. return true;
  150. }
  151. },
  152. // 编辑事件回调触发
  153. getTreeItemEditor(data) {
  154. this.$emit('treeEditor', data);
  155. },
  156. // 新增事件回调触发
  157. treeAppend(payload) {
  158. let { node, data } = payload;
  159. this.$emit('treeAppend', data);
  160. },
  161. // 删除事件回调触发
  162. treeRemove(payload) {
  163. this.$emit('treeRemove', payload);
  164. },
  165. changeDragState(b) {
  166. this.treeDraggable = b;
  167. },
  168. setExpanded(treeData, expandedKeys) {
  169. function setTreeChildeExpanded(children, that) {
  170. for (const child of children) {
  171. if (expandedKeys.indexOf(child[that.nodeKey]) > -1) {
  172. that.stDefaultExpandedKeys.push(child[that.nodeKey]);
  173. }
  174. if (child.children) {
  175. setTreeChildeExpanded(child.children, that);
  176. }
  177. }
  178. }
  179. // default expand;
  180. if (!expandedKeys || expandedKeys.length === 0) {
  181. for (const treeDataItem of treeData) {
  182. this.stDefaultExpandedKeys.push(treeDataItem[this.nodeKey]);
  183. }
  184. } else if (Array.isArray(expandedKeys)) {
  185. for (const treeDataItem of treeData) {
  186. this.stDefaultExpandedKeys.push(treeDataItem[this.nodeKey]);
  187. if (treeDataItem.children) {
  188. setTreeChildeExpanded(treeDataItem.children, this);
  189. }
  190. }
  191. }
  192. },
  193. pushExpandedKey(expandedKeys, id) {
  194. if (expandedKeys.indexOf(id) === -1) {
  195. expandedKeys.push(id);
  196. }
  197. }
  198. },
  199. computed: {},
  200. mounted() {
  201. },
  202. watch: {
  203. newData: {
  204. handler(newVal, oldVal) {
  205. this.setExpanded(newVal, this.expandedKeys);
  206. },
  207. },
  208. /*expandedKeys: {
  209. handler(newVal, oldVal) {
  210. this.setExpanded(this.newData, newVal);
  211. },
  212. // immediate: true
  213. },*/
  214. filterText(val) {
  215. this.$refs.tree.filter(val);
  216. },
  217. },
  218. };
  219. </script>