Skip to content

Commit

Permalink
fix(core): skip mixins and extends if child is already merged (vuejs#…
Browse files Browse the repository at this point in the history
  • Loading branch information
KaelWD authored and hefeng committed Jan 25, 2019
1 parent 3e4c349 commit 0c06e2d
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 7 deletions.
21 changes: 14 additions & 7 deletions src/core/util/options.js
Original file line number Diff line number Diff line change
Expand Up @@ -378,15 +378,22 @@ export function mergeOptions (
normalizeProps(child, vm)
normalizeInject(child, vm)
normalizeDirectives(child)
const extendsFrom = child.extends
if (extendsFrom) {
parent = mergeOptions(parent, extendsFrom, vm)
}
if (child.mixins) {
for (let i = 0, l = child.mixins.length; i < l; i++) {
parent = mergeOptions(parent, child.mixins[i], vm)

// Apply extends and mixins on the child options,
// but only if it is a raw options object that isn't
// the result of another mergeOptions call.
// Only merged options has the _base property.
if (!child._base) {
if (child.extends) {
parent = mergeOptions(parent, child.extends, vm)
}
if (child.mixins) {
for (let i = 0, l = child.mixins.length; i < l; i++) {
parent = mergeOptions(parent, child.mixins[i], vm)
}
}
}

const options = {}
let key
for (key in parent) {
Expand Down
19 changes: 19 additions & 0 deletions test/unit/features/global-api/extend.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,25 @@ describe('Global API: extend', () => {
expect(calls).toEqual([1, 2, 3])
})

it('should not merge nested mixins created with Vue.extend', () => {
const A = Vue.extend({
created: () => {}
})
const B = Vue.extend({
mixins: [A],
created: () => {}
})
const C = Vue.extend({
extends: B,
created: () => {}
})
const D = Vue.extend({
mixins: [C],
created: () => {}
})
expect(D.options.created.length).toBe(4)
})

it('should merge methods', () => {
const A = Vue.extend({
methods: {
Expand Down

0 comments on commit 0c06e2d

Please sign in to comment.