refactor(svelte): prevent unnecessary re-renders for node updates, selected always boolean #3336
This commit is contained in:
@@ -42,7 +42,7 @@
|
|||||||
<NodeWrapper
|
<NodeWrapper
|
||||||
id={node.id}
|
id={node.id}
|
||||||
data={node.data}
|
data={node.data}
|
||||||
selected={node.selected}
|
selected={!!node.selected}
|
||||||
draggable={!!(node.draggable || ($nodesDraggable && typeof node.draggable === 'undefined'))}
|
draggable={!!(node.draggable || ($nodesDraggable && typeof node.draggable === 'undefined'))}
|
||||||
selectable={!!(
|
selectable={!!(
|
||||||
node.selectable ||
|
node.selectable ||
|
||||||
|
|||||||
@@ -114,6 +114,8 @@
|
|||||||
width: Math.abs(mousePos.x - startX),
|
width: Math.abs(mousePos.x - startX),
|
||||||
height: Math.abs(mousePos.y - startY)
|
height: Math.abs(mousePos.y - startY)
|
||||||
};
|
};
|
||||||
|
const prevSelectedNodeIds = selectedNodes.map((n) => n.id);
|
||||||
|
const prevSelectedEdgeIds = getConnectedEdges(selectedNodes, $edges).map((e) => e.id);
|
||||||
|
|
||||||
selectedNodes = getNodesInside<Node>(
|
selectedNodes = getNodesInside<Node>(
|
||||||
$nodes,
|
$nodes,
|
||||||
@@ -125,8 +127,20 @@
|
|||||||
const selectedEdgeIds = getConnectedEdges(selectedNodes, $edges).map((e) => e.id);
|
const selectedEdgeIds = getConnectedEdges(selectedNodes, $edges).map((e) => e.id);
|
||||||
const selectedNodeIds = selectedNodes.map((n) => n.id);
|
const selectedNodeIds = selectedNodes.map((n) => n.id);
|
||||||
|
|
||||||
nodes.update((nodes) => nodes.map(toggleSelected(selectedNodeIds)));
|
// this prevents unnecessary updates while updating the selection rectangle
|
||||||
edges.update((edges) => edges.map(toggleSelected(selectedEdgeIds)));
|
if (
|
||||||
|
prevSelectedNodeIds.length !== selectedNodeIds.length ||
|
||||||
|
selectedNodeIds.some((id) => !prevSelectedNodeIds.includes(id))
|
||||||
|
) {
|
||||||
|
nodes.update((nodes) => nodes.map(toggleSelected(selectedNodeIds)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
prevSelectedEdgeIds.length !== selectedEdgeIds.length ||
|
||||||
|
selectedEdgeIds.some((id) => !prevSelectedEdgeIds.includes(id))
|
||||||
|
) {
|
||||||
|
edges.update((edges) => edges.map(toggleSelected(selectedEdgeIds)));
|
||||||
|
}
|
||||||
|
|
||||||
selectionRectMode.set('user');
|
selectionRectMode.set('user');
|
||||||
selectionRect.set(nextUserSelectRect);
|
selectionRect.set(nextUserSelectRect);
|
||||||
|
|||||||
@@ -174,8 +174,13 @@ export function createStore(): SvelteFlowStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function unselectNodesAndEdges() {
|
function unselectNodesAndEdges() {
|
||||||
store.nodes.update((ns) => ns.map(resetSelectedItem));
|
if (get(store.nodes).some((node) => node.selected)) {
|
||||||
store.edges.update((es) => es.map(resetSelectedItem));
|
store.nodes.update((ns) => ns.map(resetSelectedItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (get(store.edges).some((edge) => edge.selected)) {
|
||||||
|
store.edges.update((es) => es.map(resetSelectedItem));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
store.deleteKeyPressed.subscribe((deleteKeyPressed) => {
|
store.deleteKeyPressed.subscribe((deleteKeyPressed) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user