diff --git a/src/core/util/options.js b/src/core/util/options.js index ad36bb94151..945d43c69b8 100644 --- a/src/core/util/options.js +++ b/src/core/util/options.js @@ -85,18 +85,18 @@ export function mergeDataOrFn ( // it has to be a function to pass previous merges. return function mergedDataFn () { return mergeData( - typeof childVal === 'function' ? childVal.call(this) : childVal, - typeof parentVal === 'function' ? parentVal.call(this) : parentVal + typeof childVal === 'function' ? childVal.call(this, this) : childVal, + typeof parentVal === 'function' ? parentVal.call(this, this) : parentVal ) } } else { return function mergedInstanceDataFn () { // instance merge const instanceData = typeof childVal === 'function' - ? childVal.call(vm) + ? childVal.call(vm, vm) : childVal const defaultData = typeof parentVal === 'function' - ? parentVal.call(vm) + ? parentVal.call(vm, vm) : parentVal if (instanceData) { return mergeData(instanceData, defaultData) diff --git a/test/unit/features/options/data.spec.js b/test/unit/features/options/data.spec.js index 29a48c38b44..cb8a75ad18d 100644 --- a/test/unit/features/options/data.spec.js +++ b/test/unit/features/options/data.spec.js @@ -107,7 +107,7 @@ describe('Options data', () => { expect(vm.a).toBe(1) }) - it('should called with this', () => { + it('should be called with this', () => { const vm = new Vue({ template: '
', provide: { foo: 1 }, @@ -123,4 +123,32 @@ describe('Options data', () => { }).$mount() expect(vm.$el.innerHTML).toBe('foo:1') }) + + it('should be called with vm as first argument when merged', () => { + const superComponent = { + data: ({ foo }) => ({ ext: 'ext:' + foo }) + } + const mixins = [ + { + data: ({ foo }) => ({ mixin1: 'm1:' + foo }) + }, + { + data: ({ foo }) => ({ mixin2: 'm2:' + foo }) + } + ] + const vm = new Vue({ + template: '
', + provide: { foo: 1 }, + components: { + child: { + extends: superComponent, + mixins, + template: '{{bar}}-{{ext}}-{{mixin1}}-{{mixin2}}', + inject: ['foo'], + data: ({ foo }) => ({ bar: 'foo:' + foo }) + } + } + }).$mount() + expect(vm.$el.innerHTML).toBe('foo:1-ext:1-m1:1-m2:1') + }) })