From: HcySunYang Date: Thu, 25 Mar 2021 20:39:57 +0000 (+0800) Subject: fix(runtime-core): should call chained mixins and extends (#3040) X-Git-Tag: v3.0.8~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b58bb169590297daf9df0433b413fab118f18486;p=thirdparty%2Fvuejs%2Fcore.git fix(runtime-core): should call chained mixins and extends (#3040) fix #3038 --- diff --git a/packages/runtime-core/__tests__/apiOptions.spec.ts b/packages/runtime-core/__tests__/apiOptions.spec.ts index 41ce25fdfa..9da4e7b03d 100644 --- a/packages/runtime-core/__tests__/apiOptions.spec.ts +++ b/packages/runtime-core/__tests__/apiOptions.spec.ts @@ -644,6 +644,93 @@ describe('api: options', () => { expect(renderToString(h(Comp))).toBe('from mixin') }) + test('chained mixins in extends', () => { + const calls: string[] = [] + const mixinA = { + beforeCreate() { + calls.push('mixinA beforeCreate') + }, + created() { + calls.push('mixinA created') + } + } + + const extendA = { + mixins: [mixinA], + beforeCreate() { + calls.push('extendA beforeCreate') + }, + created() { + calls.push('extendA created') + } + } + + const Comp = { + extends: extendA, + render: () => '123', + beforeCreate() { + calls.push('self beforeCreate') + }, + created() { + calls.push('self created') + } + } + + expect(renderToString(h(Comp))).toBe(`123`) + expect(calls).toEqual([ + 'mixinA beforeCreate', + 'extendA beforeCreate', + 'self beforeCreate', + 'mixinA created', + 'extendA created', + 'self created' + ]) + }) + + test('chained extends in mixins', () => { + const calls: string[] = [] + + const extendA = { + beforeCreate() { + calls.push('extendA beforeCreate') + }, + created() { + calls.push('extendA created') + } + } + + const mixinA = { + extends: extendA, + beforeCreate() { + calls.push('mixinA beforeCreate') + }, + created() { + calls.push('mixinA created') + } + } + + const Comp = { + mixins: [mixinA], + render: () => '123', + beforeCreate() { + calls.push('self beforeCreate') + }, + created() { + calls.push('self created') + } + } + + expect(renderToString(h(Comp))).toBe(`123`) + expect(calls).toEqual([ + 'extendA beforeCreate', + 'mixinA beforeCreate', + 'self beforeCreate', + 'extendA created', + 'mixinA created', + 'self created' + ]) + }) + test('extends', () => { const calls: string[] = [] const Base = { diff --git a/packages/runtime-core/src/componentOptions.ts b/packages/runtime-core/src/componentOptions.ts index 354c9425c4..604531da67 100644 --- a/packages/runtime-core/src/componentOptions.ts +++ b/packages/runtime-core/src/componentOptions.ts @@ -839,6 +839,10 @@ function callHookFromExtends( if (base.extends) { callHookFromExtends(name, type, base.extends, instance) } + const chainedMixins = base.mixins + if (chainedMixins) { + callHookFromMixins(name, type, chainedMixins, instance) + } const baseHook = base[name] if (baseHook) { callWithAsyncErrorHandling(baseHook.bind(instance.proxy!), instance, type) @@ -853,6 +857,10 @@ function callHookFromMixins( ) { for (let i = 0; i < mixins.length; i++) { const chainedMixins = mixins[i].mixins + const chainedExtends = mixins[i].extends + if (chainedExtends) { + callHookFromExtends(name, type, chainedExtends, instance) + } if (chainedMixins) { callHookFromMixins(name, type, chainedMixins, instance) }