ElementUI中el-tree节点拖拽
<el-scrollbar class="commonScrollbar" ref="commonScrollbar">
<el-tree
:data="rootNodeData"
class="catalogTree"
ref="catalogTree"
highlight-current
node-key="id"
:expand-on-click-node="false"
@node-drag-over="handleDragOver"
@node-drop="handleDrop"
:allow-drop="allowDrop"
:allow-drag="allowDrag"
draggable>
<span class="customTreeNode" slot-scope="{ node, data }" :id="data.id"></span>
</el-tree>
</el-scrollbar>
handleDragOver(draggingNode, dropNode, ev) {
if (ev.clientY < 120) {
this.$refs.commonScrollbar.wrap.scrollTop -= 10;
} else if (ev.clientY > (this.$refs.commonScrollbar.wrap.offsetHeight + 40)) {
this.$refs.commonScrollbar.wrap.scrollTop += 10;
}
},
handleDrop(draggingNode, dropNode, dropType, ev) {
let orderType;
let canSaveOrder = true;
if (!dropNode.loaded && dropType == "inner" && !dropNode.isLeaf) {
orderType = 'top';
} else {
orderType = 'normal';
}
if (dropType == "inner") {
dropNode.isLeaf = false;
}
this.$nextTick(() => {
let oldOrderNodeParamData = [];
let oldParent;
let oldParentC;
let oldParentLevel;
if (draggingNode.data.parentId == '0') {
oldParentLevel = 0;
oldParentC = this.$refs.catalogTree.$children[0].node.parent.childNodes;
} else {
oldParent = this.$refs.catalogTree.getNode(draggingNode.data.parentId);
oldParentC = oldParent.childNodes;
oldParentLevel = oldParent.level;
}
oldParentC.forEach((element, i) => {
var oldOrderNode = {
id: element.data.id,
parentId: element.data.parentId,
order: i + 1,
name: element.data.name,
orderType: 'normal'
};
oldOrderNodeParamData.push(oldOrderNode);
});
var newOrderNodeParamData = [];
var newParentLevel = dropType != "inner" ? dropNode.parent.level : dropNode.level;
var data = dropType != "inner" ? dropNode.parent.data : dropNode.data;
var nodeData = dropType != "inner" ? dropNode.parent.childNodes : dropNode.childNodes;
let parentId = dropType != "inner" && dropNode.parent.level == 0 ? "0" : data.id;
nodeData.forEach((element, i) => {
var orderNode = {
id: element.data.id,
parentId: parentId,
order: i + 1,
name: element.data.name,
orderType: orderType
};
newOrderNodeParamData.push(orderNode);
});
let oldParentId = '';
if (oldOrderNodeParamData.length == 0) {
oldParentId = draggingNode.data.parentId;
}
this.$axios.questionBank.saveProblemStor({
newOrderNodeParamData: newOrderNodeParamData,
oldOrderNodeParamData: oldOrderNodeParamData,
doorProblemId: draggingNode.data.id,
oldParentId: oldParentId
}).then(res => {
if (res.data.data == 'haveRepeat') {
this.$message.error('文件夹中含有同名文件,不可拖动');
}
setTimeout(() => {
if (oldParentId == parentId) {
this.refreshNodeBy(parentId, {type: 'noScroll', refresh: true});
} else if (oldParentLevel <= newParentLevel) {
this.refreshNodeBy(draggingNode.data.parentId, {type: 'noScroll'});
this.refreshNodeBy(parentId, {type: 'noScroll', refresh: true});
} else {
this.refreshNodeBy(parentId, {type: 'noScroll', refresh: true});
this.refreshNodeBy(draggingNode.data.parentId, {type: 'noScroll'});
}
}, 1000)
})
})
},
allowDrop(draggingNode, dropNode, type) {
if (draggingNode.data.type == '2' && dropNode.level == 1) {
return type == 'inner' && dropNode.data.permissionType == '2';
} else if (dropNode.parent.data.constructor != Array && dropNode.parent.data.permissionType != '2' && dropNode.data.permissionType == '2') {
return type == 'inner';
} else if (dropNode.data.permissionType != '2' && dropNode.level != 1) {
return false;
} else if (dropNode.data.permissionType != '2' && dropNode.level == 1) {
return type != 'inner'
} else if (dropNode.data.type == '2') {
return type != 'inner';
} else {
return true;
}
},
allowDrag(draggingNode) {
return draggingNode.data.permissionType == '2';
},