From c7efb967ca5ab42ea2713331b8e53ae5c2746a78 Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 31 May 2021 16:48:18 -0400 Subject: [PATCH] fix(compat): fix deep data merge with extended constructor fix #3852 --- packages/runtime-core/src/compat/data.ts | 1 + packages/vue-compat/__tests__/options.spec.ts | 29 +++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/runtime-core/src/compat/data.ts b/packages/runtime-core/src/compat/data.ts index 121c0f9a688..fa8b10858c5 100644 --- a/packages/runtime-core/src/compat/data.ts +++ b/packages/runtime-core/src/compat/data.ts @@ -19,6 +19,7 @@ export function deepMergeData( to[key] = fromVal } } + return to } export function mergeDataOption(to: any, from: any) { diff --git a/packages/vue-compat/__tests__/options.spec.ts b/packages/vue-compat/__tests__/options.spec.ts index d0225dc964b..7baac30dc29 100644 --- a/packages/vue-compat/__tests__/options.spec.ts +++ b/packages/vue-compat/__tests__/options.spec.ts @@ -47,12 +47,15 @@ test('data deep merge', () => { data: () => ({ foo: { bar: 1 - } + }, + selfData: 3 }), - template: `{{ foo }}` + template: `{{ { selfData, foo } }}` }).$mount() - expect(vm.$el.textContent).toBe(JSON.stringify({ baz: 2, bar: 1 }, null, 2)) + expect(vm.$el.textContent).toBe( + JSON.stringify({ selfData: 3, foo: { baz: 2, bar: 1 } }, null, 2) + ) expect( (deprecationData[DeprecationTypes.OPTIONS_DATA_MERGE].message as Function)( 'foo' @@ -60,6 +63,26 @@ test('data deep merge', () => { ).toHaveBeenWarned() }) +// #3852 +test('data deep merge w/ extended constructor', () => { + const App = Vue.extend({ + template: `
{{ { mixinData, selfData } }}
`, + mixins: [{ data: () => ({ mixinData: 'mixinData' }) }], + data: () => ({ selfData: 'selfData' }) + }) + const vm = new App().$mount() + expect(vm.$el.textContent).toBe( + JSON.stringify( + { + mixinData: 'mixinData', + selfData: 'selfData' + }, + null, + 2 + ) + ) +}) + test('beforeDestroy/destroyed', async () => { const beforeDestroy = jest.fn() const destroyed = jest.fn()