import React, { useState, useEffect } from 'react';
import { Tree, Popconfirm, message } from 'antd';
import { user } from '@pms/console';
import { MinusCircleOutlined } from '@ant-design/icons';
import AddPositionModal from '../AddPositionModal';
import { getTree, del } from '@/services/position';
//循环
const loop = (data, key, callback) => {
data.forEach((item, index, arr) => {
if (item.positionId === key) {
return callback(item, index, arr);
}
if (item.childNode.length > 0) {
return loop(item.childNode, key, callback);
}
});
};
// 判断被移动的节点与目标节点的父节点是否一致,不可跨父节点移动
const isDescendant = (node, target, dropPosition?) => {
console.log('node?.parentId !== target?.parentId', node?.pos, target, dropPosition);
if ((node.childNode || []).length > 0 && node.expanded && dropPosition === 0) {
console.log(123132);
if (node?.pos === '0-0') return true;
if (node?.parentId !== target?.parentId) return true;
return false;
}
};
const DragTree = (props) => {
const [treeData, setTreeData] = useState([]);
const [selectedTreeKeys, setSelectTreeKeys] = useState(''); // 设置选中树节点
const getTreeData = async () => {
const res = await getTree({});
if (res?.success) {
setTreeData(res?.data);
setSelectTreeKeys(res?.data?.[0]?.childNode?.[0]?.childNode?.[0]?.positionId);
}
};
//删除
const handleDel = (nodeData) => {
del({
id: nodeData?.id,
}).then((res) => {
if (res.success) {
message.success(`删除成功`);
getTreeData();
} else {
message.warning(res.errorMsg);
}
});
};
useEffect(() => {
getTreeData();
}, []);
//点击拖拽
const onDrop = (info) => {
const dragKey = info.dragNode.key; //被拖拽节点的key
const dropKey = info.node.key; //被拖拽节点要移动到的目标key
const dropPos = info.node.pos.split('-');
const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]); //被拖拽节点要移动到的目标index(子节点第一个index从0开始)
const data = [...treeData];
const isSameLevel = (a, b) => {
const aLevel = a.props.pos.split('-').length;
const bLevel = b.props.pos.split('-').length;
console.log('isSameLevel',aLevel,bLevel)
return aLevel === bLevel;
};
const isSameParent = (a, b) => {
const aLevel = a.props.pos.split('-');
const bLevel = b.props.pos.split('-');
console.log('isSameParent',aLevel,bLevel)
aLevel.pop();
bLevel.pop();
return aLevel.join('') === bLevel.join('');
};
const isDropToFirst = (a, b) => {
const aLevel = a.props.pos.split('-');
const bLevel = b.props.pos.split('-');
console.log('isDropToFirst',aLevel,bLevel)
aLevel.pop();
return aLevel.join('') === bLevel.join('');
};
const dragNode = info.dragNode;
const dropNode = info.node;
const canDrop = (isDropToFirst(dragNode, dropNode) || (isSameParent(dragNode, dropNode) && isSameLevel(dragNode, dropNode))&&info.dropToGap) ;
if (!canDrop) {
return;
}
let dragObj; //拿到被拖拽的节点数据
loop(data, dragKey, (item, index, arr) => {
arr.splice(index, 1); //将被拖拽的节点从data中删除
dragObj = item;
});
if (!info.dropToGap) {
loop(data, dropKey, (item) => {
item.childNode = item.childNode || [];
// 将被拖拽的节点插入到目标节点上面
item.childNode.unshift(dragObj);
});
} else {
let ar; //拿到拖拽完成后的数据结构
let i; //拿到被拖拽节点的index
loop(data, dropKey, (item, index, arr) => {
ar = arr;
i = index;
});
if (dropPosition === -1) {
ar.splice(i!, 0, dragObj!);
} else {
ar?.splice(i! + 1, 0, dragObj!);
}
}
//修改tree的数据
setTreeData(data);
};
//节点
const TitleNode = (props) => {
const { nodeData } = props;
return (
<div
style={{
display: 'flex',
justifyContent: 'space-between',
width: '150px',
alignItems: 'center',
}}
onClick={() => {
if (nodeData?.childNode?.length > 0) return; //父级节点不可选中
setSelectTreeKeys(nodeData?.positionId);
}}
>
<span>{nodeData?.positionName}</span>
</div>
);
};
return (
treeData?.length > 0 && (
<Tree
selectedKeys={selectedTreeKeys ? [selectedTreeKeys] : []}
defaultExpandAll
draggable
blockNode
onDrop={onDrop}
treeData={treeData}
fieldNames={{
title: 'positionName',
key: 'positionId',
children: 'childNode',
}}
titleRender={(nodeData: any) => <TitleNode nodeData={nodeData} />}
/>
)
);
};
export default DragTree;
antd dragTree 控制只能在同层级拖拽
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 先说几个要点: 需求是实现树的拖拽,并且只能是兄弟节点之间的拖拽,而且如果不能拖拽时,要不显示出能拖拽标识;默认展...
- 成长记录-连载(三十六) ——我的第一篇五千字长文,说了什么,你一定想不到 并不是不想每天写公众号,而是之前思考怎...
- 实操尝试:1、在testcases中加入parameters进行参数化报错案例: 运行结果报错: 运行中断 1、在...
- 一季季花开花落, 沧桑了流年的巷口, 却改变不了心头前世今生的念, 那清清浅浅的风, 穿过陌陌红尘; 那丝丝柔柔的...