Skip to content

Commit ea3dccb

Browse files
committed
support multiple activeClass (close #400)
1 parent 3d12e95 commit ea3dccb

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

src/directives/link.js

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ export default function (Vue) {
1212
getAttr,
1313
isObject,
1414
addClass,
15-
removeClass
15+
removeClass,
16+
isArray
1617
} = Vue.util
1718

1819
const onPriority = Vue.directive('on').priority
@@ -175,8 +176,8 @@ export default function (Vue) {
175176
updateClasses (path, el) {
176177
const activeClass = this.activeClass || this.router._linkActiveClass
177178
// clear old class
178-
if (this.prevActiveClass !== activeClass) {
179-
removeClass(el, this.prevActiveClass)
179+
if (this.prevActiveClass && this.prevActiveClass !== activeClass) {
180+
toggleClasses(el, this.prevActiveClass, removeClass)
180181
}
181182
// remove query string before matching
182183
const dest = this.path.replace(queryStringRE, '')
@@ -188,15 +189,15 @@ export default function (Vue) {
188189
dest.charAt(dest.length - 1) !== '/' &&
189190
dest === path.replace(trailingSlashRE, '')
190191
)) {
191-
addClass(el, activeClass)
192+
toggleClasses(el, activeClass, addClass)
192193
} else {
193-
removeClass(el, activeClass)
194+
toggleClasses(el, activeClass, removeClass)
194195
}
195196
} else {
196197
if (this.activeRE && this.activeRE.test(path)) {
197-
addClass(el, activeClass)
198+
toggleClasses(el, activeClass, addClass)
198199
} else {
199-
removeClass(el, activeClass)
200+
toggleClasses(el, activeClass, removeClass)
200201
}
201202
}
202203
},
@@ -212,4 +213,18 @@ export default function (Vue) {
212213
link.hostname === location.hostname &&
213214
link.port === location.port
214215
}
216+
217+
// this function is copied from v-bind:class implementation until
218+
// we properly expose it...
219+
function toggleClasses (el, key, fn) {
220+
key = key.trim()
221+
if (key.indexOf(' ') === -1) {
222+
fn(el, key)
223+
return
224+
}
225+
var keys = key.split(/\s+/)
226+
for (var i = 0, l = keys.length; i < l; i++) {
227+
fn(el, keys[i])
228+
}
229+
}
215230
}

test/unit/specs/core.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ describe('Core', function () {
369369
var App = Vue.extend({
370370
replace: false,
371371
data: function () {
372-
return { className: 'custom' }
372+
return { className: 'a b c' }
373373
},
374374
template:
375375
'<a id="link-a" v-link="{ path: \'/a\' }">Link A</a>' +
@@ -398,13 +398,13 @@ describe('Core', function () {
398398
router.go('/b')
399399
nextTick(function () {
400400
expect(linkA.className).toBe('')
401-
expect(linkB.className).toBe('custom')
401+
expect(linkB.className).toBe('a b c')
402402
expect(linkC.className).toBe('')
403-
router.app.className = 'changed'
403+
router.app.className = 'd e'
404404
router.go('/b/c/d')
405405
nextTick(function () {
406406
expect(linkA.className).toBe('')
407-
expect(linkB.className).toBe('changed')
407+
expect(linkB.className).toBe('d e')
408408
expect(linkC.className).toBe('')
409409
router.go('/bcd')
410410
nextTick(function () {

0 commit comments

Comments
 (0)