refactor(nodes,edges): mark nodes edges as shallow reactive
# What's changed? * Mark nodes & edges as shallow reactives * defer changes to nextTick
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { CSSProperties } from 'vue'
|
import { CSSProperties } from 'vue'
|
||||||
import { useVueFlow, useDrag } from '../../composables'
|
import { useVueFlow, useDrag } from '../../composables'
|
||||||
import { GraphNode, NodeComponent, SnapGrid } from '../../types'
|
import { NodeComponent, SnapGrid } from '../../types'
|
||||||
import { NodeId } from '../../context'
|
import { NodeId } from '../../context'
|
||||||
import { getConnectedEdges, getHandleBounds, getXYZPos } from '../../utils'
|
import { getConnectedEdges, getHandleBounds, getXYZPos } from '../../utils'
|
||||||
|
|
||||||
@@ -79,10 +79,6 @@ useDrag({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
onBeforeMount(() => {
|
|
||||||
updateNodePosition({ id, diff: { x: 0, y: 0 } })
|
|
||||||
})
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const observer = useResizeObserver(nodeElement, () =>
|
const observer = useResizeObserver(nodeElement, () =>
|
||||||
updateNodeDimensions([{ id, nodeElement: nodeElement.value, forceUpdate: true }]),
|
updateNodeDimensions([{ id, nodeElement: nodeElement.value, forceUpdate: true }]),
|
||||||
@@ -98,8 +94,6 @@ onMounted(() => {
|
|||||||
|
|
||||||
onBeforeUnmount(() => observer.stop())
|
onBeforeUnmount(() => observer.stop())
|
||||||
|
|
||||||
updateNodeDimensions([{ id, nodeElement: nodeElement.value, forceUpdate: true }])
|
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
[() => node.position, () => parentNode?.computedPosition, () => node.selected, () => parentNode?.selected],
|
[() => node.position, () => parentNode?.computedPosition, () => node.selected, () => parentNode?.selected],
|
||||||
([pos, parent]) => {
|
([pos, parent]) => {
|
||||||
@@ -107,15 +101,14 @@ onMounted(() => {
|
|||||||
...pos,
|
...pos,
|
||||||
z: node.computedPosition.z ? node.computedPosition.z : node.selected ? 1000 : 0,
|
z: node.computedPosition.z ? node.computedPosition.z : node.selected ? 1000 : 0,
|
||||||
}
|
}
|
||||||
const graphNode = getNode(id)!
|
|
||||||
|
|
||||||
if (parent) {
|
if (parent) {
|
||||||
graphNode.computedPosition = getXYZPos(parent, xyzPos)
|
node.computedPosition = getXYZPos(parent, xyzPos)
|
||||||
} else {
|
} else {
|
||||||
graphNode.computedPosition = xyzPos
|
node.computedPosition = xyzPos
|
||||||
}
|
}
|
||||||
|
|
||||||
graphNode.handleBounds = getHandleBounds(nodeElement.value, viewport.zoom)
|
node.handleBounds = getHandleBounds(nodeElement.value, viewport.zoom)
|
||||||
},
|
},
|
||||||
{ deep: true, flush: 'post' },
|
{ deep: true, flush: 'post' },
|
||||||
)
|
)
|
||||||
@@ -210,7 +203,7 @@ export default {
|
|||||||
ref="nodeElement"
|
ref="nodeElement"
|
||||||
:class="getClass"
|
:class="getClass"
|
||||||
:style="getStyle"
|
:style="getStyle"
|
||||||
:data-id="id"
|
:data-id="node.id"
|
||||||
@mouseenter="onMouseEnter"
|
@mouseenter="onMouseEnter"
|
||||||
@mousemove="onMouseMove"
|
@mousemove="onMouseMove"
|
||||||
@mouseleave="onMouseLeave"
|
@mouseleave="onMouseLeave"
|
||||||
|
|||||||
@@ -87,10 +87,12 @@ const createGraphNodes = (nodes: Node[], getNode: Getters['getNode'], currGraphN
|
|||||||
const parentNodes: Record<string, true> = {}
|
const parentNodes: Record<string, true> = {}
|
||||||
|
|
||||||
const graphNodes = nodes.map((node) => {
|
const graphNodes = nodes.map((node) => {
|
||||||
const parsed = parseNode(node, extent, {
|
const parsed = shallowReactive(
|
||||||
...getNode(node.id),
|
parseNode(node, extent, {
|
||||||
parentNode: node.parentNode,
|
...getNode(node.id),
|
||||||
})
|
parentNode: node.parentNode,
|
||||||
|
}),
|
||||||
|
)
|
||||||
if (node.parentNode) {
|
if (node.parentNode) {
|
||||||
parentNodes[node.parentNode] = true
|
parentNodes[node.parentNode] = true
|
||||||
}
|
}
|
||||||
@@ -245,11 +247,11 @@ export default (state: State, getters: ComputedGetters): Actions => {
|
|||||||
|
|
||||||
const storedEdge = getters.getEdge.value(edge.id)
|
const storedEdge = getters.getEdge.value(edge.id)
|
||||||
|
|
||||||
res.push({
|
res.push(
|
||||||
...parseEdge(edge, Object.assign({}, storedEdge, state.defaultEdgeOptions)),
|
shallowReactive({
|
||||||
sourceNode,
|
...parseEdge(edge, Object.assign({}, storedEdge, state.defaultEdgeOptions)),
|
||||||
targetNode,
|
}),
|
||||||
})
|
)
|
||||||
|
|
||||||
return res
|
return res
|
||||||
}, [])
|
}, [])
|
||||||
@@ -288,12 +290,10 @@ export default (state: State, getters: ComputedGetters): Actions => {
|
|||||||
if (missingTarget || missingSource) return acc
|
if (missingTarget || missingSource) return acc
|
||||||
|
|
||||||
acc.push(
|
acc.push(
|
||||||
createAdditionChange<GraphEdge>({
|
createAdditionChange<GraphEdge>(shallowReactive({
|
||||||
...state.defaultEdgeOptions,
|
...state.defaultEdgeOptions,
|
||||||
...edge,
|
...edge,
|
||||||
sourceNode,
|
})),
|
||||||
targetNode,
|
|
||||||
}),
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -100,10 +100,11 @@ export const applyChanges = <
|
|||||||
): T[] => {
|
): T[] => {
|
||||||
let elementIds = elements.map((el) => el.id)
|
let elementIds = elements.map((el) => el.id)
|
||||||
changes.forEach((change) => {
|
changes.forEach((change) => {
|
||||||
if (change.type === 'add') {
|
nextTick(() => {
|
||||||
const item = <T>change.item
|
if (change.type === 'add') {
|
||||||
return elements.push(item)
|
const item = <T>change.item
|
||||||
}
|
return elements.push(item)
|
||||||
|
}
|
||||||
|
|
||||||
const i = elementIds.indexOf((<any>change).id)
|
const i = elementIds.indexOf((<any>change).id)
|
||||||
const el = elements[i]
|
const el = elements[i]
|
||||||
@@ -142,6 +143,7 @@ export const applyChanges = <
|
|||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
return elements
|
return elements
|
||||||
|
|||||||
@@ -62,19 +62,18 @@ export const parseNode = (node: Node, nodeExtent: CoordinateExtent, defaults?: P
|
|||||||
if (!isGraphNode(node)) {
|
if (!isGraphNode(node)) {
|
||||||
defaultValues = {
|
defaultValues = {
|
||||||
type: node.type ?? 'default',
|
type: node.type ?? 'default',
|
||||||
dimensions: {
|
dimensions: markRaw({
|
||||||
width: 0,
|
width: 0,
|
||||||
height: 0,
|
height: 0,
|
||||||
},
|
}),
|
||||||
handleBounds: {
|
handleBounds: {
|
||||||
source: [],
|
source: [],
|
||||||
target: [],
|
target: [],
|
||||||
},
|
},
|
||||||
computedPosition: {
|
computedPosition: markRaw({
|
||||||
z: 0,
|
z: 0,
|
||||||
x: 0,
|
...node.position,
|
||||||
y: 0,
|
}),
|
||||||
},
|
|
||||||
draggable: undefined,
|
draggable: undefined,
|
||||||
selectable: undefined,
|
selectable: undefined,
|
||||||
connectable: undefined,
|
connectable: undefined,
|
||||||
|
|||||||
Reference in New Issue
Block a user