From 904c2081fe2a5071da92b201bb13feb55f1d3428 Mon Sep 17 00:00:00 2001 From: artemtam Date: Thu, 22 Jan 2026 13:43:56 +0100 Subject: [PATCH 1/3] Prevent unnecessary updates when selectNodesOnDrag = false --- packages/react/src/store/index.ts | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index 1c5bdd3d..a4bb319b 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -304,8 +304,16 @@ const createStore = ({ const { edges: storeEdges, nodes: storeNodes, nodeLookup, triggerNodeChanges, triggerEdgeChanges } = get(); const nodesToUnselect = nodes ? nodes : storeNodes; const edgesToUnselect = edges ? edges : storeEdges; - const nodeChanges = nodesToUnselect.map((n) => { + + const nodeChanges: NodeSelectionChange[] = []; + + for (const n of nodesToUnselect) { + if (!n.selected) { + continue; // skip changing nodes that are not selected + } + const internalNode = nodeLookup.get(n.id); + if (internalNode) { /* * we need to unselect the internal node that was selected previously before we @@ -314,9 +322,18 @@ const createStore = ({ internalNode.selected = false; } - return createSelectionChange(n.id, false); - }); - const edgeChanges = edgesToUnselect.map((edge) => createSelectionChange(edge.id, false)); + nodeChanges.push(createSelectionChange(n.id, false)); + } + + const edgeChanges: EdgeSelectionChange[] = []; + + for (const e of edgesToUnselect) { + if (!e.selected) { + continue; // skip changing edges that are not selected + } + + edgeChanges.push(createSelectionChange(e.id, false)); + } triggerNodeChanges(nodeChanges); triggerEdgeChanges(edgeChanges); From 7b6e46ce17f49e759f614a8f933f7dc729635b48 Mon Sep 17 00:00:00 2001 From: artemtam Date: Thu, 22 Jan 2026 14:00:04 +0100 Subject: [PATCH 2/3] Changeset --- .changeset/friendly-grapes-lay.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/friendly-grapes-lay.md diff --git a/.changeset/friendly-grapes-lay.md b/.changeset/friendly-grapes-lay.md new file mode 100644 index 00000000..b092cc25 --- /dev/null +++ b/.changeset/friendly-grapes-lay.md @@ -0,0 +1,5 @@ +--- +'@xyflow/react': patch +--- + +Prevent unnecessary updates when selectNodesOnDrag = false From 89062ef506a0235f15be46412b8689c3051d32a3 Mon Sep 17 00:00:00 2001 From: Moritz Klack Date: Mon, 2 Feb 2026 12:20:35 +0100 Subject: [PATCH 3/3] Refactor loop variables for clarity in index.ts --- packages/react/src/store/index.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index a4bb319b..816059f0 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -307,12 +307,12 @@ const createStore = ({ const nodeChanges: NodeSelectionChange[] = []; - for (const n of nodesToUnselect) { - if (!n.selected) { + for (const node of nodesToUnselect) { + if (!node.selected) { continue; // skip changing nodes that are not selected } - const internalNode = nodeLookup.get(n.id); + const internalNode = nodeLookup.get(node.id); if (internalNode) { /* @@ -322,17 +322,17 @@ const createStore = ({ internalNode.selected = false; } - nodeChanges.push(createSelectionChange(n.id, false)); + nodeChanges.push(createSelectionChange(node.id, false)); } const edgeChanges: EdgeSelectionChange[] = []; - for (const e of edgesToUnselect) { - if (!e.selected) { + for (const edge of edgesToUnselect) { + if (!edge.selected) { continue; // skip changing edges that are not selected } - edgeChanges.push(createSelectionChange(e.id, false)); + edgeChanges.push(createSelectionChange(edge.id, false)); } triggerNodeChanges(nodeChanges);