UNPKG

vue-ant-patterns

Version:

vue-ant-patterns

121 lines (114 loc) 3.91 kB
import _extends from 'babel-runtime/helpers/extends'; import _toConsumableArray from 'babel-runtime/helpers/toConsumableArray'; /* * @Author: w.pengfei * @Date: 2020-09-06 11:57:27 * @LastEditTime: 2020-09-06 12:11:02 * @Description: '' * @LastEditors: w.pengfei */ import { relationHandler, relationSetHandler } from '../../es/_utils'; import { uniq, recursionDragNode } from './utils'; /** * mixin * 仅用于拆分程序 * 程序太大 */ export default { name: 'tree-drap', methods: { onDragenter: function onDragenter(obj) { // const { event, node, expandedKeys } = obj; this.$emit('dragenter', obj); }, /** * 拖拽有两种方式可实现节点数据更新 * * 1. 直接操作 treeData, 处理好关系, 并保持数据对应 * 2. 操作 listData, 处理好 rel 中声明的数据关系 * * 优缺点 * 1. 优点:: 相对来说不需要通过 listData 转换 * 1. 缺点:: listData 数据不能同步 * * 2. 与 1 正好相反: treeData 需要通过处理好的 listData 转换 * 并能同步 listData 数据 * * 此段程序使用的 第一种方式, 直接操作 treeData * @param {*} obj */ onDrop: function onDrop(obj) { var rel = this.$props.rel; var event = obj.event, node = obj.node, dragNode = obj.dragNode, dragNodesKeys = obj.dragNodesKeys, dropPosition = obj.dropPosition, dropToGap = obj.dropToGap; // 目标节点 key var dropKey = node.eventKey; // 拖拽节点 key var dragKey = dragNode.eventKey; var data = [].concat(_toConsumableArray(this.treeData)); var dropPos = node.pos.split('-'); var position = dropPosition - Number(dropPos[dropPos.length - 1]); /** * dropToGap false * 拖进节点内部, 拖拽节点放置目标节点数组中最后位置 */ /* 找到拖拽节点 */ var dragObj = void 0; recursionDragNode(data, dragKey, rel[0], function (item, index, arr) { arr.splice(index, 1); dragObj = item; }); if (!dropToGap) { recursionDragNode(data, dropKey, rel[0], function (item) { item.children = item.children || []; // 更新节点对应数据 // 拖进节点内部, parent 应为 drop 节点 // 放置最后 dragObj = _extends({}, relationSetHandler(rel[1], dropKey, dragObj)); // 同时节点应为非叶子节点 item.isLeaf = false; item.children.push(dragObj); }); } else if ((node.dataRef.children || []).length > 0 && node.expanded && position === 1) { // 更新节点对应数据 // 拖进节点内部, parent 应为 drop 节点 // 放置最前 recursionDragNode(data, dropKey, rel[0], function (item) { item.children = item.children || []; dragObj = _extends({}, relationSetHandler(rel[1], dropKey, dragObj)); item.isLeaf = false; item.children.unshift(dragObj); }); } else { var ar = void 0; var i = void 0; var targetItem = void 0; recursionDragNode(data, dropKey, rel[0], function (item, index, arr) { targetItem = item; ar = arr; i = index; }); // 获取目标节点的 pid // 在任何情况, 都统一更新拖拽节点的 pid // 有两个肯能 // 1. 在兄弟节点间排序 // 2. 跨节点转移 var pid = relationHandler(rel[1], targetItem); dragObj = _extends({}, relationSetHandler(rel[1], pid, dragObj)); if (position === -1) { ar.splice(i, 0, dragObj); } else { ar.splice(i + 1, 0, dragObj); } } this.treeData = data; this.$emit('drop', obj); } } };