fix(runtime-core): properly call lifecycle hooks in chained mixins & extends (#1974)
fix #1973
This commit is contained in:
		
							parent
							
								
									9153fc2d8a
								
							
						
					
					
						commit
						6df0e738cb
					
				@ -633,6 +633,71 @@ describe('api: options', () => {
 | 
			
		||||
    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() {
 | 
			
		||||
 | 
			
		||||
@ -614,11 +614,11 @@ function callSyncHook(
 | 
			
		||||
  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)
 | 
			
		||||
  }
 | 
			
		||||
@ -628,12 +628,30 @@ function callSyncHook(
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user