Skip to content

Commit 03be205

Browse files
author
昔梦
committed
fix:删除优化
1 parent 60dac8d commit 03be205

File tree

1 file changed

+35
-20
lines changed

1 file changed

+35
-20
lines changed

packages/x-flow/src/XFlow.tsx

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ const XFlow: FC<FlowProps> = memo(props => {
103103
const { undo, redo } = useTemporalStore();
104104
const isNodeCopyingRef = useRef(false); // 是否正在进行节点复制
105105
const lastClickedNodeRef = useRef(false); // 最后一次点击是否是节点
106+
const isPanelRenderingRef = useRef(false); // 面板是否正在渲染中
106107

107108
useEffect(() => {
108109
zoomTo(0.8);
@@ -333,11 +334,14 @@ const XFlow: FC<FlowProps> = memo(props => {
333334
onClick={async e => {
334335
// 记录用户点击了节点
335336
lastClickedNodeRef.current = true;
337+
// 标记面板开始渲染
338+
isPanelRenderingRef.current = true;
336339

337340
if (nodeEditorRef?.current?.validateForm) {
338341
const result = await nodeEditorRef?.current?.validateForm();
339342
if (!result) {
340343
message.error('请检查必填项!');
344+
isPanelRenderingRef.current = false;
341345
return;
342346
}
343347
}
@@ -353,6 +357,10 @@ const XFlow: FC<FlowProps> = memo(props => {
353357
setOpenPanel(true);
354358
}
355359
setOpenLogPanel(true);
360+
361+
setTimeout(() => {
362+
isPanelRenderingRef.current = false;
363+
}, 1000); // 给面板一点时间完成渲染
356364
}}
357365
onDelete={()=>{
358366
// 删除节点并关闭弹窗
@@ -437,31 +445,38 @@ const XFlow: FC<FlowProps> = memo(props => {
437445
message.warning(`${blockedNodes.map(n => n.data?.title || n.id).join(', ')}节点不允许删除!`);
438446
return false;
439447
}
440-
if (nodesToDelete?.length) {
448+
449+
// 检查是否删除的是当前激活的节点
450+
const hasActiveNode = nodesToDelete.some(node => node.id === activeNode?.id);
451+
if (hasActiveNode) {
452+
// 立即关闭面板和清除激活状态
441453
setOpenPanel(false);
454+
setActiveNode(null);
442455
}
443-
return true;
444-
}}
445-
onConnect={onConnect}
446-
onNodesChange={changes => {
447-
const removeChanges = changes.filter(c => c.type === 'remove');
448-
const otherChanges = changes.filter(c => c.type !== 'remove');
449-
// 处理删除操作:使用与右键菜单相同的 deleteNode 方法
450-
if (removeChanges.length > 0) {
451-
removeChanges.forEach(change => {
452-
if ('id' in change) {
453-
deleteNode(change.id);
454-
// 如果删除的是当前激活的节点,关闭面板
455-
if (change.id === activeNode?.id) {
456-
setActiveNode(null);
457-
}
458-
}
456+
457+
const executeDelete = () => {
458+
nodesToDelete.forEach(node => {
459+
deleteNode(node.id);
459460
});
461+
};
462+
463+
// 如果面板正在渲染中,延迟执行删除避免状态冲突
464+
if (isPanelRenderingRef.current) {
465+
setTimeout(() => {
466+
executeDelete();
467+
}, 150);
468+
} else {
469+
// 面板未在渲染,立即执行删除
470+
executeDelete();
460471
}
461472

462-
// 其他操作使用 ReactFlow 的默认处理
463-
if (otherChanges.length > 0) {
464-
onNodesChange(otherChanges);
473+
return false;
474+
}}
475+
onConnect={onConnect}
476+
onNodesChange={changes => {
477+
const nonRemoveChanges = changes.filter(c => c.type !== 'remove');
478+
if (nonRemoveChanges.length > 0) {
479+
onNodesChange(nonRemoveChanges);
465480
}
466481
}}
467482
onEdgesChange={changes => {

0 commit comments

Comments
 (0)