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'])
|
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 () => {
|
test('accessing setup() state from options', async () => {
|
||||||
const Comp = defineComponent({
|
const Comp = defineComponent({
|
||||||
setup() {
|
setup() {
|
||||||
|
@ -614,11 +614,11 @@ function callSyncHook(
|
|||||||
globalMixins: ComponentOptions[]
|
globalMixins: ComponentOptions[]
|
||||||
) {
|
) {
|
||||||
callHookFromMixins(name, globalMixins, ctx)
|
callHookFromMixins(name, globalMixins, ctx)
|
||||||
const baseHook = options.extends && options.extends[name]
|
|
||||||
if (baseHook) {
|
const { extends: base, mixins } = options
|
||||||
baseHook.call(ctx)
|
if (base) {
|
||||||
|
callHookFromExtends(name, base, ctx)
|
||||||
}
|
}
|
||||||
const mixins = options.mixins
|
|
||||||
if (mixins) {
|
if (mixins) {
|
||||||
callHookFromMixins(name, mixins, ctx)
|
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(
|
function callHookFromMixins(
|
||||||
name: 'beforeCreate' | 'created',
|
name: 'beforeCreate' | 'created',
|
||||||
mixins: ComponentOptions[],
|
mixins: ComponentOptions[],
|
||||||
ctx: ComponentPublicInstance
|
ctx: ComponentPublicInstance
|
||||||
) {
|
) {
|
||||||
for (let i = 0; i < mixins.length; i++) {
|
for (let i = 0; i < mixins.length; i++) {
|
||||||
|
const chainedMixins = mixins[i].mixins
|
||||||
|
if (chainedMixins) {
|
||||||
|
callHookFromMixins(name, chainedMixins, ctx)
|
||||||
|
}
|
||||||
const fn = mixins[i][name]
|
const fn = mixins[i][name]
|
||||||
if (fn) {
|
if (fn) {
|
||||||
fn.call(ctx)
|
fn.call(ctx)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user