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:
Braks
2022-05-27 23:36:01 +02:00
parent 4cb4d9c0f4
commit 33127395b6
4 changed files with 29 additions and 35 deletions
@@ -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"
+13 -13
View File
@@ -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,
}),
) )
} }
+6 -4
View File
@@ -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
+5 -6
View File
@@ -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,