Skip to content

Commit 1165cd2

Browse files
committed
address Discussion/vuejs#96: ensure correct mixin resolution order
1 parent 6432aa2 commit 1165cd2

File tree

2 files changed

+21
-16
lines changed

2 files changed

+21
-16
lines changed

src/util/merge-option.js

+9-12
Original file line numberDiff line numberDiff line change
@@ -234,25 +234,22 @@ module.exports = function mergeOptions (parent, child, vm) {
234234
guardComponents(child.components)
235235
var options = {}
236236
var key
237+
if (child.mixins) {
238+
for (var i = 0, l = child.mixins.length; i < l; i++) {
239+
parent = mergeOptions(parent, child.mixins[i], vm)
240+
}
241+
}
237242
for (key in parent) {
238-
merge(parent[key], child[key], key)
243+
merge(key)
239244
}
240245
for (key in child) {
241246
if (!(parent.hasOwnProperty(key))) {
242-
merge(parent[key], child[key], key)
243-
}
244-
}
245-
var mixins = child.mixins
246-
if (mixins) {
247-
for (var i = 0, l = mixins.length; i < l; i++) {
248-
for (key in mixins[i]) {
249-
merge(options[key], mixins[i][key], key)
250-
}
247+
merge(key)
251248
}
252249
}
253-
function merge (parentVal, childVal, key) {
250+
function merge (key) {
254251
var strat = strats[key] || defaultStrat
255-
options[key] = strat(parentVal, childVal, vm, key)
252+
options[key] = strat(parent[key], child[key], vm, key)
256253
}
257254
return options
258255
}

test/unit/specs/util/merge-option_spec.js

+12-4
Original file line numberDiff line numberDiff line change
@@ -255,18 +255,26 @@ describe('Util - Option merging', function () {
255255

256256
it('mixins', function () {
257257
var a = {}, b = {}, c = {}, d = {}
258-
var mixinA = { a: 1, directives: { a: a } }
259-
var mixinB = { b: 1, directives: { b: b } }
258+
var f1 = function () {}
259+
var f2 = function () {}
260+
var f3 = function () {}
261+
var f4 = function () {}
262+
var mixinA = { a: 1, directives: { a: a }, created: f2 }
263+
var mixinB = { b: 1, directives: { b: b }, created: f3 }
260264
var res = merge(
261-
{ a: 2, directives: { c: c } },
262-
{ directives: { d: d }, mixins: [mixinA, mixinB] }
265+
{ a: 2, directives: { c: c }, created: [f1] },
266+
{ directives: { d: d }, mixins: [mixinA, mixinB], created: f4 }
263267
)
264268
expect(res.a).toBe(1)
265269
expect(res.b).toBe(1)
266270
expect(res.directives.a).toBe(a)
267271
expect(res.directives.b).toBe(b)
268272
expect(res.directives.c).toBe(c)
269273
expect(res.directives.d).toBe(d)
274+
expect(res.created[0]).toBe(f1)
275+
expect(res.created[1]).toBe(f2)
276+
expect(res.created[2]).toBe(f3)
277+
expect(res.created[3]).toBe(f4)
270278
})
271279

272280
})

0 commit comments

Comments
 (0)