Skip to content

Commit a592fbd

Browse files
committed
refactor(core): use node lookup map internally (#1450)
* refactor(core): use node lookup map internally * chore(changeset): add
1 parent faf67c2 commit a592fbd

File tree

5 files changed

+39
-45
lines changed

5 files changed

+39
-45
lines changed

.changeset/shy-kings-compare.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@vue-flow/core": minor
3+
---
4+
5+
Replace internally nodeIds/edgeIds array with nodeLookup/edgeLookup map

packages/core/src/store/actions.ts

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type {
88
Edge,
99
EdgeAddChange,
1010
EdgeChange,
11+
EdgeLookup,
1112
EdgeRemoveChange,
1213
EdgeSelectionChange,
1314
Elements,
@@ -18,6 +19,7 @@ import type {
1819
NodeAddChange,
1920
NodeChange,
2021
NodeDimensionChange,
22+
NodeLookup,
2123
NodePositionChange,
2224
NodeRemoveChange,
2325
NodeSelectionChange,
@@ -55,15 +57,13 @@ import { storeOptionsToSkip, useState } from './state'
5557
export function useActions(
5658
id: string,
5759
state: State,
58-
// todo: change to a Set
59-
nodeIds: ComputedRef<string[]>,
60-
// todo: change to a Set
61-
edgeIds: ComputedRef<string[]>,
60+
nodeLookup: ComputedRef<NodeLookup>,
61+
edgeLookup: ComputedRef<EdgeLookup>,
6262
): Actions {
6363
const viewportHelper = useViewportHelper(state)
6464

6565
const updateNodeInternals: Actions['updateNodeInternals'] = (ids) => {
66-
const updateIds = ids ?? nodeIds.value ?? []
66+
const updateIds = ids ?? state.nodes.map((n) => n.id) ?? []
6767

6868
state.hooks.updateNodeInternals.trigger(updateIds)
6969
}
@@ -85,23 +85,15 @@ export function useActions(
8585
return
8686
}
8787

88-
if (state.nodes && !nodeIds.value.length) {
89-
return state.nodes.find((node) => node.id === id)
90-
}
91-
92-
return state.nodes[nodeIds.value.indexOf(id)]
88+
return nodeLookup.value.get(id)
9389
}
9490

9591
const findEdge: Actions['findEdge'] = (id) => {
9692
if (!id) {
9793
return
9894
}
9995

100-
if (state.edges && !edgeIds.value.length) {
101-
return state.edges.find((edge) => edge.id === id)
102-
}
103-
104-
return state.edges[edgeIds.value.indexOf(id)]
96+
return edgeLookup.value.get(id)
10597
}
10698

10799
const updateNodePositions: Actions['updateNodePositions'] = (dragItems, changed, dragging) => {
@@ -370,7 +362,7 @@ export function useActions(
370362

371363
const setNodeExtent: Actions['setNodeExtent'] = (nodeExtent) => {
372364
state.nodeExtent = nodeExtent
373-
updateNodeInternals(nodeIds.value)
365+
updateNodeInternals()
374366
}
375367

376368
const setInteractive: Actions['setInteractive'] = (isInteractive) => {

packages/core/src/store/getters.ts

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,23 @@
11
import type { ComputedRef } from 'vue'
22
import { computed } from 'vue'
3-
import type { ComputedGetters, GraphEdge, GraphNode, State } from '../types'
3+
import type { ComputedGetters, EdgeLookup, GraphEdge, GraphNode, NodeLookup, State } from '../types'
44
import { getNodesInside, isEdgeVisible } from '../utils'
55
import { defaultEdgeTypes, defaultNodeTypes } from '../utils/defaultNodesEdges'
66

7-
export function useGetters(state: State, nodeIds: ComputedRef<string[]>, edgeIds: ComputedRef<string[]>): ComputedGetters {
7+
export function useGetters(
8+
state: State,
9+
nodeLookup: ComputedRef<NodeLookup>,
10+
edgeLookup: ComputedRef<EdgeLookup>,
11+
): ComputedGetters {
812
/**
913
* @deprecated will be removed in next major version; use findNode instead
1014
*/
11-
const getNode: ComputedGetters['getNode'] = computed(() => (id: string) => {
12-
if (state.nodes && !nodeIds.value.length) {
13-
return state.nodes.find((node) => node.id === id)
14-
}
15-
16-
return state.nodes[nodeIds.value.indexOf(id)]
17-
})
15+
const getNode: ComputedGetters['getNode'] = computed(() => (id) => nodeLookup.value.get(id))
1816

1917
/**
2018
* @deprecated will be removed in next major version; use findEdge instead
2119
*/
22-
const getEdge: ComputedGetters['getEdge'] = computed(() => (id: string) => {
23-
if (state.edges && !edgeIds.value.length) {
24-
return state.edges.find((edge) => edge.id === id)
25-
}
26-
27-
return state.edges[edgeIds.value.indexOf(id)]
28-
})
20+
const getEdge: ComputedGetters['getEdge'] = computed(() => (id) => edgeLookup.value.get(id))
2921

3022
const getEdgeTypes: ComputedGetters['getEdgeTypes'] = computed(() => {
3123
const edgeTypes: Record<string, any> = {
@@ -80,8 +72,8 @@ export function useGetters(state: State, nodeIds: ComputedRef<string[]>, edgeIds
8072
const visibleEdges: GraphEdge[] = []
8173

8274
for (const edge of state.edges) {
83-
const source = getNode.value(edge.source)!
84-
const target = getNode.value(edge.target)!
75+
const source = nodeLookup.value.get(edge.source)!
76+
const target = nodeLookup.value.get(edge.target)!
8577

8678
if (
8779
isEdgeVisible({

packages/core/src/types/store.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ import type { CustomEvent, FlowHooks, FlowHooksEmit, FlowHooksOn } from './hooks
3131
import type { EdgeChange, NodeChange, NodeDragItem } from './changes'
3232
import type { ConnectingHandle, ValidConnectionFunc } from './handle'
3333

34+
export type NodeLookup = Map<string, GraphNode>
35+
36+
export type EdgeLookup = Map<string, GraphEdge>
37+
3438
export interface UpdateNodeDimensionsParams {
3539
id: string
3640
nodeElement: HTMLDivElement

packages/core/src/utils/storage.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { toRefs } from '@vueuse/core'
22
import { computed, getCurrentInstance, reactive } from 'vue'
3-
import type { FlowOptions, VueFlowStore } from '../types'
3+
import type { FlowOptions, GraphEdge, GraphNode, VueFlowStore } from '../types'
44
import { useActions, useGetters, useState } from '../store'
55

66
/**
@@ -57,27 +57,28 @@ export class Storage {
5757
}
5858

5959
// for lookup purposes
60-
const nodeIds = computed(() => {
61-
const ids: string[] = []
60+
const nodeLookup = computed(() => {
61+
const nodesMap = new Map<string, GraphNode>()
6262
for (const node of reactiveState.nodes) {
63-
ids.push(node.id)
63+
nodesMap.set(node.id, node)
6464
}
6565

66-
return ids
66+
return nodesMap
6767
})
6868

69-
const edgeIds = computed(() => {
70-
const ids: string[] = []
69+
const edgeLookup = computed(() => {
70+
const edgesMap = new Map<string, GraphEdge>()
71+
7172
for (const edge of reactiveState.edges) {
72-
ids.push(edge.id)
73+
edgesMap.set(edge.id, edge)
7374
}
7475

75-
return ids
76+
return edgesMap
7677
})
7778

78-
const getters = useGetters(reactiveState, nodeIds, edgeIds)
79+
const getters = useGetters(reactiveState, nodeLookup, edgeLookup)
7980

80-
const actions = useActions(id, reactiveState, nodeIds, edgeIds)
81+
const actions = useActions(id, reactiveState, nodeLookup, edgeLookup)
8182

8283
actions.setState({ ...reactiveState, ...preloadedState })
8384

0 commit comments

Comments
 (0)