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', () => {
])
})
+ 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() {
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)
}
to[key] = from[key]
}
}
+ const { mixins, extends: extendsOptions } = from
+
+ extendsOptions && mergeOptions(to, extendsOptions, instance)
+ mixins &&
+ mixins.forEach((m: ComponentOptionsMixin) => mergeOptions(to, m, instance))
}