@@ -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