fix(viewpane,nodes): move resize observer to mounted hooks

This commit is contained in:
braks
2022-10-07 22:55:38 +02:00
committed by Braks
parent fe918c0bd8
commit de6220b3b3
2 changed files with 40 additions and 34 deletions
@@ -23,19 +23,21 @@ const draggable = (d?: boolean) => (typeof d === 'undefined' ? nodesDraggable :
const selectable = (s?: boolean) => (typeof s === 'undefined' ? elementsSelectable : s) const selectable = (s?: boolean) => (typeof s === 'undefined' ? elementsSelectable : s)
const connectable = (c?: boolean) => (typeof c === 'undefined' ? nodesConnectable : c) const connectable = (c?: boolean) => (typeof c === 'undefined' ? nodesConnectable : c)
const resizeObserver = new ResizeObserver((entries) => { const resizeObserver = ref<ResizeObserver>()
const updates = entries.map((entry: ResizeObserverEntry) => ({
id: entry.target.getAttribute('data-id') as string,
nodeElement: entry.target as HTMLDivElement,
forceUpdate: true,
}))
updateNodeDimensions(updates) onMounted(() => {
resizeObserver.value = new ResizeObserver((entries) => {
const updates = entries.map((entry: ResizeObserverEntry) => ({
id: entry.target.getAttribute('data-id') as string,
nodeElement: entry.target as HTMLDivElement,
forceUpdate: true,
}))
updateNodeDimensions(updates)
})
}) })
onBeforeUnmount(() => { onBeforeUnmount(() => resizeObserver.value?.disconnect())
resizeObserver.disconnect()
})
const getType = (type?: string, template?: GraphNode['template']) => { const getType = (type?: string, template?: GraphNode['template']) => {
const name = type || 'default' const name = type || 'default'
@@ -70,17 +72,19 @@ export default {
<template> <template>
<div class="vue-flow__nodes vue-flow__container"> <div class="vue-flow__nodes vue-flow__container">
<NodeWrapper <template v-if="resizeObserver">
v-for="node of getNodes" <NodeWrapper
:id="node.id" v-for="node of getNodes"
:key="node.id" :id="node.id"
:resize-observer="resizeObserver" :key="node.id"
:type="getType(node.type, node.template)" :resize-observer="resizeObserver"
:name="node.type || 'default'" :type="getType(node.type, node.template)"
:draggable="draggable(node.draggable)" :name="node.type || 'default'"
:selectable="selectable(node.selectable)" :draggable="draggable(node.draggable)"
:connectable="connectable(node.connectable)" :selectable="selectable(node.selectable)"
:node="node" :connectable="connectable(node.connectable)"
/> :node="node"
/>
</template>
</div> </div>
</template> </template>
@@ -57,21 +57,23 @@ let transform = $ref({
zoom: clampedZoom, zoom: clampedZoom,
}) })
useResizeObserver(viewportEl, (ev) => { onMounted(() => {
if (!ev[0].target) return useResizeObserver(viewportEl, () => {
if (!viewportEl.value) return
const { width, height } = getDimensions(ev[0].target as HTMLDivElement) const { width, height } = getDimensions(viewportEl.value)
dimensions.width = width dimensions.width = width
dimensions.height = height dimensions.height = height
}) })
const window = useWindow() const window = useWindow()
useEventListener(window, 'resize', () => { useEventListener(window, 'resize', () => {
if (!viewportEl.value) return if (!viewportEl.value) return
const { width, height } = getDimensions(viewportEl.value) const { width, height } = getDimensions(viewportEl.value)
dimensions.width = width dimensions.width = width
dimensions.height = height dimensions.height = height
})
}) })
onMounted(() => { onMounted(() => {