expect(calls).toEqual(['base', 'mixin', 'comp'])
})
+ test('beforeCreate/created in extends and mixins', () => {
+ const calls: string[] = []
+ const BaseA = {
+ beforeCreate() {
+ calls.push('beforeCreateA')
+ },
+ created() {
+ calls.push('createdA')
+ }
+ }
+ const BaseB = {
+ extends: BaseA,
+ beforeCreate() {
+ calls.push('beforeCreateB')
+ },
+ created() {
+ calls.push('createdB')
+ }
+ }
+
+ const MixinA = {
+ beforeCreate() {
+ calls.push('beforeCreateC')
+ },
+ created() {
+ calls.push('createdC')
+ }
+ }
+ const MixinB = {
+ mixins: [MixinA],
+ beforeCreate() {
+ calls.push('beforeCreateD')
+ },
+ created() {
+ calls.push('createdD')
+ }
+ }
+
+ const Comp = {
+ extends: BaseB,
+ mixins: [MixinB],
+ beforeCreate() {
+ calls.push('selfBeforeCreate')
+ },
+ created() {
+ calls.push('selfCreated')
+ },
+ render() {}
+ }
+
+ renderToString(h(Comp))
+ expect(calls).toEqual([
+ 'beforeCreateA',
+ 'beforeCreateB',
+ 'beforeCreateC',
+ 'beforeCreateD',
+ 'selfBeforeCreate',
+ 'createdA',
+ 'createdB',
+ 'createdC',
+ 'createdD',
+ 'selfCreated'
+ ])
+ })
+
test('accessing setup() state from options', async () => {
const Comp = defineComponent({
setup() {
globalMixins: ComponentOptions[]
) {
callHookFromMixins(name, globalMixins, ctx)
- const baseHook = options.extends && options.extends[name]
- if (baseHook) {
- baseHook.call(ctx)
+
+ const { extends: base, mixins } = options
+ if (base) {
+ callHookFromExtends(name, base, ctx)
}
- const mixins = options.mixins
if (mixins) {
callHookFromMixins(name, mixins, ctx)
}
}
}
+function callHookFromExtends(
+ name: 'beforeCreate' | 'created',
+ base: ComponentOptions,
+ ctx: ComponentPublicInstance
+) {
+ if (base.extends) {
+ callHookFromExtends(name, base.extends, ctx)
+ }
+ const baseHook = base[name]
+ if (baseHook) {
+ baseHook.call(ctx)
+ }
+}
+
function callHookFromMixins(
name: 'beforeCreate' | 'created',
mixins: ComponentOptions[],
ctx: ComponentPublicInstance
) {
for (let i = 0; i < mixins.length; i++) {
+ const chainedMixins = mixins[i].mixins
+ if (chainedMixins) {
+ callHookFromMixins(name, chainedMixins, ctx)
+ }
const fn = mixins[i][name]
if (fn) {
fn.call(ctx)