]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compat): fix deep data merge with extended constructor
authorEvan You <yyx990803@gmail.com>
Mon, 31 May 2021 20:48:18 +0000 (16:48 -0400)
committerEvan You <yyx990803@gmail.com>
Mon, 31 May 2021 20:48:18 +0000 (16:48 -0400)
fix #3852

packages/runtime-core/src/compat/data.ts
packages/vue-compat/__tests__/options.spec.ts

index 121c0f9a688a4eca0f54852ae0e6cf3743a5d3e8..fa8b10858c541fb4d797ca1be9a308d7af99fff2 100644 (file)
@@ -19,6 +19,7 @@ export function deepMergeData(
       to[key] = fromVal
     }
   }
+  return to
 }
 
 export function mergeDataOption(to: any, from: any) {
index d0225dc964b66de346ae49b711de469fb113fd29..7baac30dc29fb61b98c97077b73047f2760c0772 100644 (file)
@@ -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: `<pre>{{ { mixinData, selfData } }}</pre>`,
+    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()