From: 丶远方 Date: Wed, 12 Jul 2023 03:13:20 +0000 (+0800) Subject: perf(custom-element): cancel `MutationObserver` listener when disconnected (#8666) X-Git-Tag: v3.3.5~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=24d98f03276de5b0fbced5a4c9d61b24e7d9d084;p=thirdparty%2Fvuejs%2Fcore.git perf(custom-element): cancel `MutationObserver` listener when disconnected (#8666) --- diff --git a/packages/runtime-dom/src/apiCustomElement.ts b/packages/runtime-dom/src/apiCustomElement.ts index 2add422586..5662b0b535 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