From: edison Date: Thu, 5 Jun 2025 02:10:52 +0000 (+0800) Subject: fix(custom-element): ensure configureApp is applied to async component (#12607) X-Git-Tag: v3.5.17~21 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5ba1afba09c3ea56c1c17484f5d8aeae210ce52a;p=thirdparty%2Fvuejs%2Fcore.git fix(custom-element): ensure configureApp is applied to async component (#12607) close #12448 --- diff --git a/packages/runtime-dom/__tests__/customElement.spec.ts b/packages/runtime-dom/__tests__/customElement.spec.ts index a2b4c26369..c44840df5e 100644 --- a/packages/runtime-dom/__tests__/customElement.spec.ts +++ b/packages/runtime-dom/__tests__/customElement.spec.ts @@ -1566,6 +1566,29 @@ describe('defineCustomElement', () => { expect(e.shadowRoot?.innerHTML).toBe('
app-injected
') }) + // #12448 + test('work with async component', async () => { + const AsyncComp = defineAsyncComponent(() => { + return Promise.resolve({ + render() { + const msg: string | undefined = inject('msg') + return h('div', {}, msg) + }, + } as any) + }) + const E = defineCustomElement(AsyncComp, { + configureApp(app) { + app.provide('msg', 'app-injected') + }, + }) + customElements.define('my-async-element-with-app', E) + + container.innerHTML = `` + const e = container.childNodes[0] as VueElement + await new Promise(r => setTimeout(r)) + expect(e.shadowRoot?.innerHTML).toBe('
app-injected
') + }) + test('with hmr reload', async () => { const __hmrId = '__hmrWithApp' const def = defineComponent({ diff --git a/packages/runtime-dom/src/apiCustomElement.ts b/packages/runtime-dom/src/apiCustomElement.ts index 56b86a5fd9..edf7c43135 100644 --- a/packages/runtime-dom/src/apiCustomElement.ts +++ b/packages/runtime-dom/src/apiCustomElement.ts @@ -404,9 +404,10 @@ export class VueElement const asyncDef = (this._def as ComponentOptions).__asyncLoader if (asyncDef) { - this._pendingResolve = asyncDef().then(def => - resolve((this._def = def), true), - ) + this._pendingResolve = asyncDef().then((def: InnerComponentDef) => { + def.configureApp = this._def.configureApp + resolve((this._def = def), true) + }) } else { resolve(this._def) }