fix(compat): correctly merge lifecycle hooks when using Vue.extend (#3762)

fix #3761
This commit is contained in:
Stanislav Lashmanov
2021-05-13 00:13:44 +03:00
committed by GitHub
parent a56ab148fd
commit 2bfb8b574d
4 changed files with 79 additions and 44 deletions

View File

@@ -145,22 +145,31 @@ describe('GLOBAL_EXTEND', () => {
})
it('should not merge nested mixins created with Vue.extend', () => {
const a = jest.fn();
const b = jest.fn();
const c = jest.fn();
const d = jest.fn();
const A = Vue.extend({
created: () => {}
created: a
})
const B = Vue.extend({
mixins: [A],
created: () => {}
created: b
})
const C = Vue.extend({
extends: B,
created: () => {}
created: c
})
const D = Vue.extend({
mixins: [C],
created: () => {}
created: d,
render() { return null },
})
expect(D.options.created!.length).toBe(4)
new D().$mount()
expect(a.mock.calls.length).toStrictEqual(1)
expect(b.mock.calls.length).toStrictEqual(1)
expect(c.mock.calls.length).toStrictEqual(1)
expect(d.mock.calls.length).toStrictEqual(1)
})
it('should merge methods', () => {

View File

@@ -10,7 +10,8 @@ beforeEach(() => {
toggleDeprecationWarning(true)
Vue.configureCompat({
MODE: 2,
GLOBAL_MOUNT: 'suppress-warning'
GLOBAL_MOUNT: 'suppress-warning',
GLOBAL_EXTEND: 'suppress-warning'
})
})
@@ -90,3 +91,35 @@ test('beforeDestroy/destroyed', async () => {
deprecationData[DeprecationTypes.OPTIONS_DESTROYED].message
).toHaveBeenWarned()
})
test('beforeDestroy/destroyed in Vue.extend components', async () => {
const beforeDestroy = jest.fn()
const destroyed = jest.fn()
const child = Vue.extend({
template: `foo`,
beforeDestroy,
destroyed
})
const vm = new Vue({
template: `<child v-if="ok"/>`,
data() {
return { ok: true }
},
components: { child }
}).$mount() as any
vm.ok = false
await nextTick()
expect(beforeDestroy).toHaveBeenCalled()
expect(destroyed).toHaveBeenCalled()
expect(
deprecationData[DeprecationTypes.OPTIONS_BEFORE_DESTROY].message
).toHaveBeenWarned()
expect(
deprecationData[DeprecationTypes.OPTIONS_DESTROYED].message
).toHaveBeenWarned()
})