refactor(nodes): use single resize observer for nodes
This commit is contained in:
@@ -14,6 +14,7 @@ const { id, type, name, draggable, selectable, connectable, snapGrid, ...props }
|
|||||||
type: NodeComponent | Function | Object | false
|
type: NodeComponent | Function | Object | false
|
||||||
name: string
|
name: string
|
||||||
node: GraphNode
|
node: GraphNode
|
||||||
|
resizeObserver: ResizeObserver
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
provide(NodeId, id)
|
provide(NodeId, id)
|
||||||
@@ -59,10 +60,6 @@ const dragging = useDrag({
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const observer = useResizeObserver(nodeElement, (ev) => {
|
|
||||||
updateNodeDimensions([{ id, nodeElement: ev[0].target as HTMLDivElement, forceUpdate: true }])
|
|
||||||
})
|
|
||||||
|
|
||||||
const updatePosition = (nodePos: XYZPosition, parentPos?: XYZPosition) => {
|
const updatePosition = (nodePos: XYZPosition, parentPos?: XYZPosition) => {
|
||||||
if (parentPos) {
|
if (parentPos) {
|
||||||
node.computedPosition = getXYZPos({ x: parentPos.x, y: parentPos.y, z: parentPos.z! }, nodePos)
|
node.computedPosition = getXYZPos({ x: parentPos.x, y: parentPos.y, z: parentPos.z! }, nodePos)
|
||||||
@@ -100,6 +97,8 @@ updatePosition(
|
|||||||
)
|
)
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
props.resizeObserver.observe(nodeElement.value)
|
||||||
|
|
||||||
if (!scope) scope = effectScope()
|
if (!scope) scope = effectScope()
|
||||||
|
|
||||||
scope.run(() => {
|
scope.run(() => {
|
||||||
@@ -138,7 +137,7 @@ onMounted(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
observer.stop()
|
props.resizeObserver.unobserve(nodeElement.value)
|
||||||
scope?.stop()
|
scope?.stop()
|
||||||
scope = undefined
|
scope = undefined
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -16,12 +16,29 @@ const {
|
|||||||
getNode,
|
getNode,
|
||||||
getNodes,
|
getNodes,
|
||||||
getNodeTypes,
|
getNodeTypes,
|
||||||
|
updateNodeDimensions,
|
||||||
} = $(useVueFlow())
|
} = $(useVueFlow())
|
||||||
|
|
||||||
const draggable = (d?: boolean) => (typeof d === 'undefined' ? nodesDraggable : d)
|
const draggable = (d?: boolean) => (typeof d === 'undefined' ? nodesDraggable : d)
|
||||||
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 updates = entries.map((entry: ResizeObserverEntry) => ({
|
||||||
|
id: entry.target.getAttribute('data-id') as string,
|
||||||
|
nodeElement: entry.target as HTMLDivElement,
|
||||||
|
forceUpdate: true,
|
||||||
|
}))
|
||||||
|
|
||||||
|
updates.forEach((u) => console.log(u.nodeElement.getBoundingClientRect().left))
|
||||||
|
|
||||||
|
updateNodeDimensions(updates)
|
||||||
|
})
|
||||||
|
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
resizeObserver.disconnect()
|
||||||
|
})
|
||||||
|
|
||||||
const getType = (type?: string, template?: GraphNode['template']) => {
|
const getType = (type?: string, template?: GraphNode['template']) => {
|
||||||
const name = type || 'default'
|
const name = type || 'default'
|
||||||
let nodeType = template ?? getNodeTypes[name]
|
let nodeType = template ?? getNodeTypes[name]
|
||||||
@@ -59,6 +76,7 @@ export default {
|
|||||||
v-for="node of getNodes"
|
v-for="node of getNodes"
|
||||||
:id="node.id"
|
:id="node.id"
|
||||||
:key="node.id"
|
:key="node.id"
|
||||||
|
:resize-observer="resizeObserver"
|
||||||
:type="getType(node.type, node.template)"
|
:type="getType(node.type, node.template)"
|
||||||
:name="node.type || 'default'"
|
:name="node.type || 'default'"
|
||||||
:draggable="draggable(node.draggable)"
|
:draggable="draggable(node.draggable)"
|
||||||
|
|||||||
Reference in New Issue
Block a user