Skip to content

Commit

Permalink
fix(runtime-core): ensure consistent $options merge behavior with 2.x (
Browse files Browse the repository at this point in the history
…#1986)

close #1978 , close #1979
  • Loading branch information
unbyte authored Sep 1, 2020
1 parent 8ed0b34 commit 706b52a
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 4 deletions.
2 changes: 1 addition & 1 deletion packages/runtime-core/__tests__/apiCreateApp.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ describe('api: createApp', () => {
app.config.optionMergeStrategies.foo = (a, b) => (a ? `${a},` : ``) + b

app.mount(nodeOps.createElement('div'))
expect(merged!).toBe('global,extends,mixin,local')
expect(merged!).toBe('local,extends,mixin,global')
})

test('config.globalProperties', () => {
Expand Down
44 changes: 44 additions & 0 deletions packages/runtime-core/__tests__/apiOptions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,50 @@ describe('api: options', () => {
])
})

test('flatten merged options', async () => {
const MixinBase = {
msg1: 'base'
}
const ExtendsBase = {
msg2: 'base'
}
const Mixin = {
mixins: [MixinBase]
}
const Extends = {
extends: ExtendsBase
}
const Comp = defineComponent({
extends: defineComponent(Extends),
mixins: [defineComponent(Mixin)],
render() {
return `${this.$options.msg1},${this.$options.msg2}`
}
})

expect(renderToString(h(Comp))).toBe('base,base')
})

test('options defined in component have higher priority', async () => {
const Mixin = {
msg1: 'base'
}
const Extends = {
msg2: 'base'
}
const Comp = defineComponent({
msg1: 'local',
msg2: 'local',
extends: defineComponent(Extends),
mixins: [defineComponent(Mixin)],
render() {
return `${this.$options.msg1},${this.$options.msg2}`
}
})

expect(renderToString(h(Comp))).toBe('local,local')
})

test('accessing setup() state from options', async () => {
const Comp = defineComponent({
setup() {
Expand Down
9 changes: 6 additions & 3 deletions packages/runtime-core/src/componentOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -767,10 +767,8 @@ export function resolveMergedOptions(
const globalMixins = instance.appContext.mixins
if (!globalMixins.length && !mixins && !extendsOptions) return raw
const options = {}
globalMixins.forEach(m => mergeOptions(options, m, instance))
extendsOptions && mergeOptions(options, extendsOptions, instance)
mixins && mixins.forEach(m => mergeOptions(options, m, instance))
mergeOptions(options, raw, instance)
globalMixins.forEach(m => mergeOptions(options, m, instance))
return (raw.__merged = options)
}

Expand All @@ -783,4 +781,9 @@ function mergeOptions(to: any, from: any, instance: ComponentInternalInstance) {
to[key] = from[key]
}
}
const { mixins, extends: extendsOptions } = from

extendsOptions && mergeOptions(to, extendsOptions, instance)
mixins &&
mixins.forEach((m: ComponentOptionsMixin) => mergeOptions(to, m, instance))
}

0 comments on commit 706b52a

Please sign in to comment.