最近因为仿钉钉做内部IM,头觉得ElementUI功能有点简单了,不太适合当前业务需求,于是舍弃了,换成了 Ant Design Vue,这下好,之前做的功能全部重新修改…
没办法,谁让人生就是这样改来改去,推掉重来
在修改部门的时候,原本的组织架构拖拽排序并实时后台存储从el-tree 换成了 a-tree 后,之前的代码不能用了,但是思路大体还是一致,然后我找了找a-tree 的节点规律以及官方文档,自己重写了一个,原则上还是以尽可能的少改动数据为优先,在你拖拽结束后 不会全拿整棵树的数据排序然后再去修改,只会有当前受影响的最小粒度的数据变更范围
注:如果需要其他tree排序,请前往 tree拖拽排序通用合集(z-Tree、El-tree、a-tree)
首先我们的Vue文件声明如下(由于文件内容多,只贴关键代码),主要加入了draggable属性和drop事件,支持拖拽
<a-tree
draggable
:tree-data="data"
:replace-fields="replaceFields"
default-expand-all
@select="handleNodeSelect"
@drop="onDrop"
>
</a-tree>
核心思路方向
在vue methods中添加onDrop方法,通过对info多次分析数据结构后,发现规律以及和el-tree的不同
- el-tree的level规则判定和a-tree一样,第一层级level都为0,并且根节点上还有一层
- el-tree拖拽完节点会发生改变,即使不更新后台,但是a-tree 只有tree的tree-data 发生改变,才会更改节点
- 当我们拿到节点对应的data,el-tree的data会自动更新,比如新拖入一个就会自动加入,而a-tree你拿到的永远是一开始tree加载后的值,需要手动变更以及指定顺序
具体Vue文件实现如下,思路在注释中注明:
methods: {
onDrop(info) {
// 目标节点
const node = info.node;
// 拖拽节点
const dragNode = info.dragNode;
const dragNodeData