diff --git a/packages/runtime-dom/src/apiCustomElement.ts b/packages/runtime-dom/src/apiCustomElement.ts index 2add422586d..5662b0b535b 100644 --- a/packages/runtime-dom/src/apiCustomElement.ts +++ b/packages/runtime-dom/src/apiCustomElement.ts @@ -178,7 +178,7 @@ export class VueElement extends BaseClass { private _resolved = false private _numberProps: Record | null = null private _styles?: HTMLStyleElement[] - + private _ob?: MutationObserver | null = null constructor( private _def: InnerComponentDef, private _props: Record = {}, @@ -215,6 +215,10 @@ export class VueElement extends BaseClass { disconnectedCallback() { this._connected = false + if (this._ob) { + this._ob.disconnect() + this._ob = null + } nextTick(() => { if (!this._connected) { render(null, this.shadowRoot!) @@ -235,11 +239,13 @@ export class VueElement extends BaseClass { } // watch future attr changes - new MutationObserver(mutations => { + this._ob = new MutationObserver(mutations => { for (const m of mutations) { this._setAttr(m.attributeName!) } - }).observe(this, { attributes: true }) + }) + + this._ob.observe(this, { attributes: true }) const resolve = (def: InnerComponentDef, isAsync = false) => { const { props, styles } = def