Skip to content

Commit 4175511

Browse files
author
昔梦
committed
fix:多条线离得近的时候,快速切换hover的时候线的颜色没有消失
1 parent c4b2d88 commit 4175511

File tree

1 file changed

+42
-16
lines changed

1 file changed

+42
-16
lines changed

packages/x-flow/src/XFlow.tsx

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -250,18 +250,32 @@ const XFlow: FC<FlowProps> = memo(props => {
250250
setCandidateNode(newNode);
251251
};
252252

253-
// edge 移入/移出效果
254-
const getUpdateEdgeConfig = useMemoizedFn((edge: any, color: string) => {
255-
const newEdges = produce(edges, draft => {
256-
const currEdge: any = draft.find(e => e.id === edge.id);
257-
currEdge.style = {
258-
...edge.style,
259-
stroke: color,
260-
};
261-
currEdge.markerEnd = {
262-
...edge?.markerEnd,
263-
color,
264-
};
253+
254+
const hoveredEdgeIdRef = useRef<string | null>(null);// edge 移入/移出效果
255+
256+
const getUpdateEdgeConfig = useMemoizedFn((edgeId: string, color: string, shouldCheckColor = false, allowedColors?: string[]) => {
257+
const currentEdges = storeApi.getState().edges;
258+
const currEdge = currentEdges.find(e => e.id === edgeId);
259+
260+
// 如果需要检查颜色,只有在允许的颜色范围内才更新
261+
if (shouldCheckColor && allowedColors && currEdge?.style?.stroke) {
262+
if (!allowedColors.includes(currEdge.style.stroke)) {
263+
return; // 如果是自定义颜色,不更新
264+
}
265+
}
266+
267+
const newEdges = produce(currentEdges, draft => {
268+
const draftEdge: any = draft.find(e => e.id === edgeId);
269+
if (draftEdge) {
270+
draftEdge.style = {
271+
...draftEdge.style,
272+
stroke: color,
273+
};
274+
draftEdge.markerEnd = {
275+
...draftEdge.markerEnd,
276+
color,
277+
};
278+
}
265279
});
266280
setEdges(newEdges);
267281
});
@@ -455,14 +469,26 @@ const XFlow: FC<FlowProps> = memo(props => {
455469
});
456470
}}
457471
onEdgeMouseEnter={(_, edge: any) => {
458-
if (!edge.style.stroke || edge.style.stroke === '#c9c9c9') {
459-
getUpdateEdgeConfig(edge, '#2970ff');
472+
// 如果之前有 hover 的 edge,先重置它的颜色(只重置我们设置过的颜色)
473+
if (hoveredEdgeIdRef.current && hoveredEdgeIdRef.current !== edge.id) {
474+
getUpdateEdgeConfig(hoveredEdgeIdRef.current, '#c9c9c9', true, ['#2970ff', '#c9c9c9']);
475+
}
476+
hoveredEdgeIdRef.current = edge.id;
477+
// 设置当前 edge 为高亮色(只有当没有自定义颜色时才更新)
478+
const currentEdges = storeApi.getState().edges;
479+
const currentEdge = currentEdges.find(e => e.id === edge.id);
480+
const currentStroke = currentEdge?.style?.stroke;
481+
// 只有当没有设置颜色或是默认灰色时才设置为高亮色
482+
if (!currentStroke || currentStroke === '#c9c9c9') {
483+
getUpdateEdgeConfig(edge.id, '#2970ff');
460484
}
461485
}}
462486
onEdgeMouseLeave={(_, edge) => {
463-
if (['#2970ff', '#c9c9c9'].includes(edge.style.stroke)) {
464-
getUpdateEdgeConfig(edge, '#c9c9c9');
487+
if (hoveredEdgeIdRef.current === edge.id) {
488+
// 重置当前 edge 的颜色(只重置我们设置过的颜色)
489+
hoveredEdgeIdRef.current = null;
465490
}
491+
getUpdateEdgeConfig(edge.id, '#c9c9c9', true, ['#2970ff', '#c9c9c9']);
466492
}}
467493
onNodesDelete={() => {
468494
setActiveNode(null);

0 commit comments

Comments
 (0)