From: edison Date: Wed, 7 Aug 2024 04:02:38 +0000 (+0800) Subject: fix(runtime-core): prioritize using the provides from currentApp in nested createApp... X-Git-Tag: v3.4.37~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7e75de002f08076a02c9361a58fa1d0af1772964;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-core): prioritize using the provides from currentApp in nested createApp (#11502) close #11488 --- diff --git a/packages/runtime-core/__tests__/apiCreateApp.spec.ts b/packages/runtime-core/__tests__/apiCreateApp.spec.ts index f638633974..23843b5999 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 f15983604b..2021f6d317 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