Skip to content

Commit 32c0511

Browse files
ktsnyyx990803
authored andcommitted
Allow extended Vue constructors as the mixins option (#2957)
1 parent 746b3e5 commit 32c0511

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

src/util/options.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,11 @@ export function mergeOptions (parent, child, vm) {
339339
}
340340
if (child.mixins) {
341341
for (var i = 0, l = child.mixins.length; i < l; i++) {
342-
parent = mergeOptions(parent, child.mixins[i], vm)
342+
var mixin = child.mixins[i]
343+
var mixinOptions = mixin.prototype instanceof Vue
344+
? mixin.options
345+
: mixin
346+
parent = mergeOptions(parent, mixinOptions, vm)
343347
}
344348
}
345349
for (key in parent) {

test/unit/specs/util/options_spec.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,12 +303,14 @@ describe('Util - Option merging', function () {
303303
var f4 = function () {}
304304
var mixinA = { a: 1, directives: { a: a }, created: f2 }
305305
var mixinB = { b: 1, directives: { b: b }, created: f3 }
306+
var mixinC = Vue.extend({ c: 1 })
306307
var res = merge(
307308
{ a: 2, directives: { c: c }, created: [f1] },
308-
{ directives: { d: d }, mixins: [mixinA, mixinB], created: f4 }
309+
{ directives: { d: d }, mixins: [mixinA, mixinB, mixinC], created: f4 }
309310
)
310311
expect(res.a).toBe(1)
311312
expect(res.b).toBe(1)
313+
expect(res.c).toBe(1)
312314
expect(res.directives.a).toBe(a)
313315
expect(res.directives.b).toBe(b)
314316
expect(res.directives.c).toBe(c)

0 commit comments

Comments
 (0)