]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(runtime-core): fix priority of option merging (#2041)
authorᴜɴвʏтᴇ <i@shangyes.net>
Thu, 3 Sep 2020 14:35:43 +0000 (09:35 -0500)
committerGitHub <noreply@github.com>
Thu, 3 Sep 2020 14:35:43 +0000 (10:35 -0400)
packages/runtime-core/__tests__/apiCreateApp.spec.ts
packages/runtime-core/src/componentOptions.ts

index 0c7faf711aa12dcf8539beb1a6048bffa1f786ab..c3be3476c2c09bbd08ac2c67eb3e7c2ce1a95bda 100644 (file)
@@ -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', () => {
index 5af8c410dd6d85213b25194ca01321d0eea5b5b9..fd473714771051b0f5bd2cdf4c1636645ca6ddb4 100644 (file)
@@ -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))
 }