diff --git a/package/src/components/Edges/EdgeWrapper.vue b/package/src/components/Edges/EdgeWrapper.vue index da8a3cd4..44002a6a 100644 --- a/package/src/components/Edges/EdgeWrapper.vue +++ b/package/src/components/Edges/EdgeWrapper.vue @@ -113,10 +113,14 @@ onMounted(() => { if (edge.value.targetX !== targetX) edge.value.targetX = targetX if (edge.value.targetY !== targetY) edge.value.targetY = targetY }, - { immediate: true, deep: true }, + { immediate: true }, ) }) +onUnmounted(() => { + edge.value = null +}) + const slots = inject(Slots) const name = ref(edge.value.type ?? 'default') diff --git a/package/src/components/Nodes/NodeWrapper.vue b/package/src/components/Nodes/NodeWrapper.vue index 8141eea5..fc665461 100644 --- a/package/src/components/Nodes/NodeWrapper.vue +++ b/package/src/components/Nodes/NodeWrapper.vue @@ -55,7 +55,7 @@ const onSelectNodeHandler = (event: MouseEvent) => { } onMounted(() => { - useResizeObserver(nodeElement, () => + const observer = useResizeObserver(nodeElement, () => store.updateNodeDimensions([{ id: node.value.id, nodeElement: nodeElement.value, forceUpdate: true }]), ) @@ -67,6 +67,8 @@ onMounted(() => { { flush: 'post' }, ) + onBeforeUnmount(() => observer.stop()) + store.updateNodeDimensions([{ id: node.value.id, nodeElement: nodeElement.value, forceUpdate: true }]) }) @@ -91,9 +93,13 @@ watch( node.value.handleBounds = getHandleBounds(nodeElement.value, scale.value) }, - { deep: true }, ) +onUnmounted(() => { + nodeElement.value = undefined + node.value = null +}) + store.updateNodePosition({ id: node.value.id, diff: { x: 0, y: 0 } }) const slots = inject(Slots) diff --git a/package/src/composables/useVueFlow.ts b/package/src/composables/useVueFlow.ts index 6050e987..93bc53ac 100644 --- a/package/src/composables/useVueFlow.ts +++ b/package/src/composables/useVueFlow.ts @@ -106,7 +106,8 @@ export default (options?: Options): UseVueFlow => { scope.vueFlowId = name onScopeDispose(() => { - storage.remove(name) + vueFlow!.$reset() + storage.remove(vueFlow!.id) vueFlow = null }) } @@ -116,7 +117,9 @@ export default (options?: Options): UseVueFlow => { if (!vueFlow) throw new Error('[vueflow]: store instance not found.') - if (scope) provide(VueFlow, vueFlow) + if (scope) { + provide(VueFlow, vueFlow) + } return vueFlow } diff --git a/package/src/container/NodeRenderer/NodeRenderer.vue b/package/src/container/NodeRenderer/NodeRenderer.vue index f169a38d..97ac4ecd 100644 --- a/package/src/container/NodeRenderer/NodeRenderer.vue +++ b/package/src/container/NodeRenderer/NodeRenderer.vue @@ -1,8 +1,22 @@ diff --git a/package/src/container/Viewport/Transform.vue b/package/src/container/Viewport/Transform.vue index a51eace3..ddc35664 100644 --- a/package/src/container/Viewport/Transform.vue +++ b/package/src/container/Viewport/Transform.vue @@ -5,7 +5,7 @@ import { useVueFlow, useZoomPanHelper, useWindow } from '../../composables' import { FlowExportObject, FlowInstance, Store, XYPosition } from '../../types' import { pointToRendererPoint } from '../../utils' -const { id, store } = useVueFlow() +const { store } = useVueFlow() const untilDimensions = async (store: Store) => { // if ssr we can't wait for dimensions, they'll never really exist @@ -55,9 +55,9 @@ onMounted(async () => { await untilDimensions(store) ready.value = true - store.instance = instance + store.instance = instance as FlowInstance store.fitViewOnInit && instance.fitView() - store.hooks.paneReady.trigger(instance) + store.hooks.paneReady.trigger(instance as FlowInstance) }) const transform = computed(() => `translate(${store.viewport.x}px,${store.viewport.y}px) scale(${store.viewport.zoom})`) @@ -68,13 +68,16 @@ export default { } diff --git a/package/src/container/Viewport/Viewport.vue b/package/src/container/Viewport/Viewport.vue index 7ac40c80..db703f84 100644 --- a/package/src/container/Viewport/Viewport.vue +++ b/package/src/container/Viewport/Viewport.vue @@ -7,7 +7,7 @@ import { clamp, clampPosition } from '../../utils' import SelectionPane from '../SelectionPane/SelectionPane.vue' import Transform from './Transform.vue' -const { id, store, zoomActivationKeyCode, selectionKeyCode } = useVueFlow() +const { store, zoomActivationKeyCode, selectionKeyCode } = useVueFlow() const viewportEl = templateRef('viewport', null) const viewChanged = (prevTransform: FlowTransform, eventTransform: ZoomTransform): boolean => @@ -83,7 +83,7 @@ onMounted(() => { }) d3Selection - ?.on('wheel', (event: WheelEvent) => { + .on('wheel', (event: WheelEvent) => { if (store.panOnScroll && !zoomKeyPressed.value) { if (isWrappedWithClass(event, store.noWheelClassName)) return event.preventDefault() @@ -108,7 +108,7 @@ onMounted(() => { const deltaY = store.panOnScrollMode === PanOnScrollMode.Horizontal ? 0 : event.deltaY * deltaNormalize if (d3Selection && store.panOnScrollSpeed) - d3Zoom?.translateBy( + d3Zoom.translateBy( d3Selection, -(deltaX / currentZoom) * store.panOnScrollSpeed, -(deltaY / currentZoom) * store.panOnScrollSpeed, @@ -163,10 +163,10 @@ export default { } diff --git a/package/src/container/VueFlow/VueFlow.vue b/package/src/container/VueFlow/VueFlow.vue index ddc8969f..32a679e6 100644 --- a/package/src/container/VueFlow/VueFlow.vue +++ b/package/src/container/VueFlow/VueFlow.vue @@ -33,7 +33,10 @@ const modelProps = useVModels(props, emit) const { id, hooks, getNodeTypes, getEdgeTypes, ...rest } = useVueFlow() const dispose = useWatch(modelProps, { id, hooks, getNodeTypes, getEdgeTypes, ...rest }) -onUnmounted(() => dispose()) + +onUnmounted(() => { + dispose() +}) useHooks(emit, hooks.value) @@ -46,14 +49,14 @@ export default {