From: ᴜɴвʏтᴇ Date: Thu, 3 Sep 2020 14:35:43 +0000 (-0500) Subject: fix(runtime-core): fix priority of option merging (#2041) X-Git-Tag: v3.0.0-rc.11~47 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=95c07d8c36a69bfc29e661fbbfb92735c4fe5d3e;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-core): fix priority of option merging (#2041) --- diff --git a/packages/runtime-core/__tests__/apiCreateApp.spec.ts b/packages/runtime-core/__tests__/apiCreateApp.spec.ts index 0c7faf711a..c3be3476c2 100644 --- a/packages/runtime-core/__tests__/apiCreateApp.spec.ts +++ b/packages/runtime-core/__tests__/apiCreateApp.spec.ts @@ -457,7 +457,7 @@ describe('api: createApp', () => { app.config.optionMergeStrategies.foo = (a, b) => (a ? `${a},` : ``) + b app.mount(nodeOps.createElement('div')) - expect(merged!).toBe('local,extends,mixin,global') + expect(merged!).toBe('global,extends,mixin,local') }) test('config.globalProperties', () => { diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/componentOptions.ts index 5af8c410dd..fd47371477 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/componentOptions.ts @@ -768,23 +768,24 @@ export function resolveMergedOptions( const globalMixins = instance.appContext.mixins if (!globalMixins.length && !mixins && !extendsOptions) return raw const options = {} - mergeOptions(options, raw, instance) globalMixins.forEach(m => mergeOptions(options, m, instance)) + mergeOptions(options, raw, instance) return (raw.__merged = options) } function mergeOptions(to: any, from: any, instance: ComponentInternalInstance) { const strats = instance.appContext.config.optionMergeStrategies + const { mixins, extends: extendsOptions } = from + + extendsOptions && mergeOptions(to, extendsOptions, instance) + mixins && + mixins.forEach((m: ComponentOptionsMixin) => mergeOptions(to, m, instance)) + for (const key in from) { if (strats && hasOwn(strats, key)) { to[key] = strats[key](to[key], from[key], instance.proxy, key) - } else if (!hasOwn(to, key)) { + } else { to[key] = from[key] } } - const { mixins, extends: extendsOptions } = from - - extendsOptions && mergeOptions(to, extendsOptions, instance) - mixins && - mixins.forEach((m: ComponentOptionsMixin) => mergeOptions(to, m, instance)) }