fix: clean up BPMN viewer resize observer

pull/880/head^2
YunaiV 2026-05-23 21:06:20 +08:00
parent cb78c2935d
commit a2fbf5b712
1 changed files with 41 additions and 29 deletions

View File

@ -176,6 +176,41 @@ const processReZoom = () => {
bpmnViewer.value?.get('canvas').zoom('fit-viewport', 'auto') bpmnViewer.value?.get('canvas').zoom('fit-viewport', 'auto')
} }
let resizeObserver: ResizeObserver | null = null
/** 停止 ResizeObserver */
const stopResizeObserver = () => {
if (resizeObserver) {
resizeObserver.disconnect()
resizeObserver = null
}
}
/** 启动 ResizeObserver 监听容器尺寸变化 */
const startResizeObserver = () => {
stopResizeObserver()
if (!processCanvas.value || !bpmnViewer.value) {
return
}
const { clientWidth, clientHeight } = processCanvas.value
if (clientWidth > 0 && clientHeight > 0) {
processReZoom()
return
}
resizeObserver = new ResizeObserver((entries) => {
for (const entry of entries) {
const { width, height } = entry.contentRect
if (width > 0 && height > 0 && bpmnViewer.value) {
processReZoom()
stopResizeObserver()
}
}
})
resizeObserver.observe(processCanvas.value)
}
/** Zoom放大 */ /** Zoom放大 */
const processZoomIn = (zoomStep = 0.1) => { const processZoomIn = (zoomStep = 0.1) => {
let newZoom = Math.floor(defaultZoom.value * 100 + zoomStep * 100) / 100 let newZoom = Math.floor(defaultZoom.value * 100 + zoomStep * 100) / 100
@ -198,6 +233,7 @@ const processZoomOut = (zoomStep = 0.1) => {
/** 流程图预览清空 */ /** 流程图预览清空 */
const clearViewer = () => { const clearViewer = () => {
stopResizeObserver()
if (processCanvas.value) { if (processCanvas.value) {
processCanvas.value.innerHTML = '' processCanvas.value.innerHTML = ''
} }
@ -278,8 +314,11 @@ const importXML = async (xml: string) => {
// //
setProcessStatus(props.view) setProcessStatus(props.view)
// ResizeObserver // ResizeObserver
await nextTick() // https://github.com/yudaocode/yudao-ui-admin-vue3/pull/221
startResizeObserver() if (bpmnViewer.value) {
await nextTick()
startResizeObserver()
}
} }
} }
} }
@ -379,31 +418,4 @@ onMounted(() => {
onBeforeUnmount(() => { onBeforeUnmount(() => {
clearViewer() clearViewer()
}) })
let resizeObserver: ResizeObserver | null = null
/** 启动 ResizeObserver 监听容器尺寸变化 */
const startResizeObserver = () => {
stopResizeObserver()
if (!processCanvas.value) return
resizeObserver = new ResizeObserver((entries) => {
for (const entry of entries) {
const { width, height } = entry.contentRect
if (width > 0 && height > 0 && bpmnViewer.value) {
processReZoom()
stopResizeObserver()
}
}
})
resizeObserver.observe(processCanvas.value)
}
/** 停止 ResizeObserver */
const stopResizeObserver = () => {
if (resizeObserver) {
resizeObserver.disconnect()
resizeObserver = null
}
}
</script> </script>