Skip to content

Commit 706b52a

Browse files
authored
fix(runtime-core): ensure consistent $options merge behavior with 2.x (#1986)
close #1978 , close #1979
1 parent 8ed0b34 commit 706b52a

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

packages/runtime-core/__tests__/apiCreateApp.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ describe('api: createApp', () => {
457457
app.config.optionMergeStrategies.foo = (a, b) => (a ? `${a},` : ``) + b
458458

459459
app.mount(nodeOps.createElement('div'))
460-
expect(merged!).toBe('global,extends,mixin,local')
460+
expect(merged!).toBe('local,extends,mixin,global')
461461
})
462462

463463
test('config.globalProperties', () => {

packages/runtime-core/__tests__/apiOptions.spec.ts

+44
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,50 @@ describe('api: options', () => {
698698
])
699699
})
700700

701+
test('flatten merged options', async () => {
702+
const MixinBase = {
703+
msg1: 'base'
704+
}
705+
const ExtendsBase = {
706+
msg2: 'base'
707+
}
708+
const Mixin = {
709+
mixins: [MixinBase]
710+
}
711+
const Extends = {
712+
extends: ExtendsBase
713+
}
714+
const Comp = defineComponent({
715+
extends: defineComponent(Extends),
716+
mixins: [defineComponent(Mixin)],
717+
render() {
718+
return `${this.$options.msg1},${this.$options.msg2}`
719+
}
720+
})
721+
722+
expect(renderToString(h(Comp))).toBe('base,base')
723+
})
724+
725+
test('options defined in component have higher priority', async () => {
726+
const Mixin = {
727+
msg1: 'base'
728+
}
729+
const Extends = {
730+
msg2: 'base'
731+
}
732+
const Comp = defineComponent({
733+
msg1: 'local',
734+
msg2: 'local',
735+
extends: defineComponent(Extends),
736+
mixins: [defineComponent(Mixin)],
737+
render() {
738+
return `${this.$options.msg1},${this.$options.msg2}`
739+
}
740+
})
741+
742+
expect(renderToString(h(Comp))).toBe('local,local')
743+
})
744+
701745
test('accessing setup() state from options', async () => {
702746
const Comp = defineComponent({
703747
setup() {

packages/runtime-core/src/componentOptions.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -767,10 +767,8 @@ export function resolveMergedOptions(
767767
const globalMixins = instance.appContext.mixins
768768
if (!globalMixins.length && !mixins && !extendsOptions) return raw
769769
const options = {}
770-
globalMixins.forEach(m => mergeOptions(options, m, instance))
771-
extendsOptions && mergeOptions(options, extendsOptions, instance)
772-
mixins && mixins.forEach(m => mergeOptions(options, m, instance))
773770
mergeOptions(options, raw, instance)
771+
globalMixins.forEach(m => mergeOptions(options, m, instance))
774772
return (raw.__merged = options)
775773
}
776774

@@ -783,4 +781,9 @@ function mergeOptions(to: any, from: any, instance: ComponentInternalInstance) {
783781
to[key] = from[key]
784782
}
785783
}
784+
const { mixins, extends: extendsOptions } = from
785+
786+
extendsOptions && mergeOptions(to, extendsOptions, instance)
787+
mixins &&
788+
mixins.forEach((m: ComponentOptionsMixin) => mergeOptions(to, m, instance))
786789
}

0 commit comments

Comments
 (0)