diff --git a/packages/editor/src/Editor.vue b/packages/editor/src/Editor.vue index ba12f1b4..8c6a8f07 100644 --- a/packages/editor/src/Editor.vue +++ b/packages/editor/src/Editor.vue @@ -267,7 +267,16 @@ export default defineComponent({ }, ); - onUnmounted(() => editorService.destroy()); + uiService.initColumnWidth(); + + onUnmounted(() => { + editorService.destroy(); + historyService.destroy(); + propsService.destroy(); + uiService.destroy(); + componentListService.destroy(); + storageService.destroy(); + }); const services: Services = { componentListService, diff --git a/packages/editor/src/services/componentList.ts b/packages/editor/src/services/componentList.ts index 397dbab5..6c7790f9 100644 --- a/packages/editor/src/services/componentList.ts +++ b/packages/editor/src/services/componentList.ts @@ -41,6 +41,11 @@ class ComponentList extends BaseService { public getList(): ComponentGroup[] { return this.state.list; } + + public destroy() { + this.state.list = []; + this.removeAllListeners(); + } } export type ComponentListService = ComponentList; diff --git a/packages/editor/src/services/editor.ts b/packages/editor/src/services/editor.ts index 7acbab17..ca4c8140 100644 --- a/packages/editor/src/services/editor.ts +++ b/packages/editor/src/services/editor.ts @@ -741,6 +741,10 @@ class Editor extends BaseService { this.set('nodes', []); this.set('page', null); this.set('parent', null); + this.set('stage', null); + this.set('highlightNode', null); + this.set('modifiedNodeIds', new Map()); + this.set('pageLength', new Map()); } public resetModifiedNodeId() { diff --git a/packages/editor/src/services/events.ts b/packages/editor/src/services/events.ts index cc0d16be..73f1672c 100644 --- a/packages/editor/src/services/events.ts +++ b/packages/editor/src/services/events.ts @@ -26,8 +26,8 @@ import type { ComponentGroup } from '../type'; import BaseService from './BaseService'; -const eventMap: Record = reactive({}); -const methodMap: Record = reactive({}); +let eventMap: Record = reactive({}); +let methodMap: Record = reactive({}); class Events extends BaseService { constructor() { @@ -75,6 +75,12 @@ class Events extends BaseService { public getMethod(type: string) { return cloneDeep(methodMap[type] || DEFAULT_METHODS); } + + public destroy() { + eventMap = reactive({}); + methodMap = reactive({}); + this.removeAllListeners(); + } } export type EventsService = Events; diff --git a/packages/editor/src/services/props.ts b/packages/editor/src/services/props.ts index dd355a67..2722a9c3 100644 --- a/packages/editor/src/services/props.ts +++ b/packages/editor/src/services/props.ts @@ -171,6 +171,12 @@ class Props extends BaseService { }; } + public destroy() { + this.state.propsConfigMap = {}; + this.state.propsValueMap = {}; + this.removeAllListeners(); + } + /** * 生成指定位数的GUID,无【-】格式 * @param digit 位数,默认值8 diff --git a/packages/editor/src/services/storage.ts b/packages/editor/src/services/storage.ts index a2c907d6..881bbbfb 100644 --- a/packages/editor/src/services/storage.ts +++ b/packages/editor/src/services/storage.ts @@ -107,6 +107,10 @@ export class WebStorage extends BaseService { storage.setItem(`${options.namespace || namespace}:${key}`, item); } + public destroy() { + this.removeAllListeners(); + } + private getValueAndProtocol(value: string | null) { let protocol = ''; diff --git a/packages/editor/src/services/ui.ts b/packages/editor/src/services/ui.ts index 1e0dde76..63c1be99 100644 --- a/packages/editor/src/services/ui.ts +++ b/packages/editor/src/services/ui.ts @@ -64,16 +64,6 @@ class Ui extends BaseService { center: 'auto', }); }); - - const columnWidthCacheData = globalThis.localStorage.getItem(COLUMN_WIDTH_STORAGE_KEY); - if (columnWidthCacheData) { - try { - const columnWidthCache = JSON.parse(columnWidthCacheData); - this.setColumnWidth(columnWidthCache); - } catch (e) { - console.error(e); - } - } } public set(name: keyof UiState, value: T) { @@ -104,6 +94,18 @@ class Ui extends BaseService { return (state as any)[name]; } + public initColumnWidth() { + const columnWidthCacheData = globalThis.localStorage.getItem(COLUMN_WIDTH_STORAGE_KEY); + if (columnWidthCacheData) { + try { + const columnWidthCache = JSON.parse(columnWidthCacheData); + this.setColumnWidth(columnWidthCache); + } catch (e) { + console.error(e); + } + } + } + public zoom(zoom: number) { this.set('zoom', (this.get('zoom') * 100 + zoom * 100) / 100); if (this.get('zoom') < 0.1) this.set('zoom', 0.1); @@ -125,6 +127,10 @@ class Ui extends BaseService { return Math.min((width - 60) / stageWidth || 1, (height - 80) / stageHeight || 1); } + public destroy() { + this.removeAllListeners(); + } + private setColumnWidth({ left, center, right }: SetColumnWidth) { const columnWidth = { ...toRaw(this.get('columnWidth')),