Skip to content

Commit

Permalink
fix: data() should be called with vm as first argument in mixins
Browse files Browse the repository at this point in the history
  • Loading branch information
Guillaume Chau authored and hefeng committed Jan 25, 2019
1 parent e7ac6ef commit 8ec3e51
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
8 changes: 4 additions & 4 deletions src/core/util/options.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
30 changes: 29 additions & 1 deletion test/unit/features/options/data.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: '<div><child></child></div>',
provide: { foo: 1 },
Expand All @@ -123,4 +123,32 @@ describe('Options data', () => {
}).$mount()
expect(vm.$el.innerHTML).toBe('<span>foo:1</span>')
})

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: '<div><child></child></div>',
provide: { foo: 1 },
components: {
child: {
extends: superComponent,
mixins,
template: '<span>{{bar}}-{{ext}}-{{mixin1}}-{{mixin2}}</span>',
inject: ['foo'],
data: ({ foo }) => ({ bar: 'foo:' + foo })
}
}
}).$mount()
expect(vm.$el.innerHTML).toBe('<span>foo:1-ext:1-m1:1-m2:1</span>')
})
})

0 comments on commit 8ec3e51

Please sign in to comment.