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';
//循環(huán)
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);
}
});
};
// 判斷被移動的節(jié)點與目標節(jié)點的父節(jié)點是否一致,不可跨父節(jié)點移動
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(''); // 設(shè)置選中樹節(jié)點
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; //被拖拽節(jié)點的key
const dropKey = info.node.key; //被拖拽節(jié)點要移動到的目標key
const dropPos = info.node.pos.split('-');
const dropPosition = info.dropPosition - Number(dropPos[dropPos.length - 1]); //被拖拽節(jié)點要移動到的目標index(子節(jié)點第一個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; //拿到被拖拽的節(jié)點數(shù)據(jù)
loop(data, dragKey, (item, index, arr) => {
arr.splice(index, 1); //將被拖拽的節(jié)點從data中刪除
dragObj = item;
});
if (!info.dropToGap) {
loop(data, dropKey, (item) => {
item.childNode = item.childNode || [];
// 將被拖拽的節(jié)點插入到目標節(jié)點上面
item.childNode.unshift(dragObj);
});
} else {
let ar; //拿到拖拽完成后的數(shù)據(jù)結(jié)構(gòu)
let i; //拿到被拖拽節(jié)點的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的數(shù)據(jù)
setTreeData(data);
};
//節(jié)點
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; //父級節(jié)點不可選中
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 控制只能在同層級拖拽
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 先說幾個要點: 需求是實現(xiàn)樹的拖拽,并且只能是兄弟節(jié)點之間的拖拽,而且如果不能拖拽時,要不顯示出能拖拽標識;默認展...
- 成長記錄-連載(三十六) ——我的第一篇五千字長文,說了什么,你一定想不到 并不是不想每天寫公眾號,而是之前思考怎...
- 中國人的禮尚往來離不開吃,有客來,吃的標準之高低直接影響到客人的心情以及你在親友間的風評。比方說,客人落座...
- 實操嘗試:1、在testcases中加入parameters進行參數(shù)化報錯案例: 運行結(jié)果報錯: 運行中斷 1、在...
- 一季季花開花落, 滄桑了流年的巷口, 卻改變不了心頭前世今生的念, 那清清淺淺的風, 穿過陌陌紅塵; 那絲絲柔柔的...