diff --git a/packages/runtime-core/__tests__/apiCreateApp.spec.ts b/packages/runtime-core/__tests__/apiCreateApp.spec.ts index f6386339741..23843b59993 100644 --- a/packages/runtime-core/__tests__/apiCreateApp.spec.ts +++ b/packages/runtime-core/__tests__/apiCreateApp.spec.ts @@ -116,12 +116,25 @@ describe('api: createApp', () => { const app = createApp({ setup() { provide('foo', 'should not be seen') + + // nested createApp + const childApp = createApp({ + setup() { + provide('foo', 'foo from child') + }, + }) + + childApp.provide('foo', 2) + expect(childApp.runWithContext(() => inject('foo'))).toBe(2) + return () => h('div') }, }) app.provide('foo', 1) expect(app.runWithContext(() => inject('foo'))).toBe(1) + const root = nodeOps.createElement('div') + app.mount(root) expect( app.runWithContext(() => { diff --git a/packages/runtime-core/src/apiInject.ts b/packages/runtime-core/src/apiInject.ts index f15983604bb..2021f6d3177 100644 --- a/packages/runtime-core/src/apiInject.ts +++ b/packages/runtime-core/src/apiInject.ts @@ -56,11 +56,14 @@ export function inject( // #2400 // to support `app.use` plugins, // fallback to appContext's `provides` if the instance is at root - const provides = instance - ? instance.parent == null - ? instance.vnode.appContext && instance.vnode.appContext.provides - : instance.parent.provides - : currentApp!._context.provides + // #11488, in a nested createApp, prioritize using the provides from currentApp + const provides = currentApp + ? currentApp._context.provides + : instance + ? instance.parent == null + ? instance.vnode.appContext && instance.vnode.appContext.provides + : instance.parent.provides + : undefined if (provides && (key as string | symbol) in provides) { // TS doesn't allow symbol as index type