#javascript #vue.js
#javascript #vue.js
Вопрос:
Когда я нажимаю sub menu
на следующий шаблон, как мне добавить active
класс в <a>
класс родственного <router-link>
( menu1
или menu2
)?
<ul class="depth1">
<li class="m1">
<router-link to="/introduce/Introduce" @click="selected = 1" :class="{ active: selected == 1 }"><span>menu1</span></router-link>
<ul class="depth2 sm1">
<li><router-link to="" @click="selected = 1">sub menu</router-link></li>
<li><router-link to="" @click="selected = 1">sub menu</router-link></li>
<li><router-link to="" @click="selected = 1">sub menu</router-link></li>
</ul>
</li>
<li class="m2">
<router-link to="/introduce/Introduce" @click="selected = 2" :class="{ active: selected == 2 }"><span>menu2</span></router-link>
<ul class="depth2 sm1">
<li><router-link to="" @click="selected = 2">sub menu</router-link></li>
<li><router-link to="" @click="selected = 2">sub menu</router-link></li>
<li><router-link to="" @click="selected = 2">sub menu</router-link></li>
</ul>
</li>
</ul>
<script>
export default {
data: function () {
return {
selected: false,
};
},
methods: {
},
};
</script>
Комментарии:
1. Я не вижу ни одного родительского элемента «a»
2. @Ayudh
<router-link>
<a>
По умолчанию используется корневой элемент.
Ответ №1:
Ваша попытка близка к работе, но click
обработчик не вызывается, потому что он применяется неправильно.
Чтобы добавить click
обработчик к корневому элементу <router-link>
(т.Е. <a>
Тегу), используйте @click.native
:
<router-link to="" @click.native="selected = 1">sub menu</router-link>
^^^^^^^
Ответ №2:
но почему бы не использовать vue-router
поведение по умолчанию (ссылка автоматически получает активный класс, когда активен целевой маршрут), как показано на демонстрации ниже
const Home = {
template: '<div><h2>Home</h2></div>'
}
const About = {
template: '<div><h2>About</h2></div>'
}
const Users = {
template: `
<div>
<h2>Users</h2>
<router-view></router-view>
</div>
`
}
const User = {
template: '<div>{{ $route.params.username }}</div>'
}
const router = new VueRouter({
mode: 'history',
routes: [{
path: '/',
component: Home
},
{
path: '/about',
component: About
},
{
path: '/users',
component: Users,
children: [{
path: ':username',
name: 'user',
component: User
}]
}
]
})
new Vue({
router,
}).$mount('#app')
a.router-link-active {
color: #f66;
}
li.router-link-active a {
color: #f66;
}
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>
<div id="app">
<h1>Active Links</h1>
<ul>
<li>
<router-link to="/">/</router-link>
</li>
<li>
<router-link to="/" exact>/ (exact match)</router-link>
</li>
<li>
<router-link to="/users">/users</router-link>
</li>
<li>
<router-link to="/users" exact>/users (exact match)</router-link>
</li>
<li>
<router-link to="/users/evan">/users/evan</router-link>
</li>
<li>
<router-link to="/users/evan#foo">/users/evan#foo</router-link>
</li>
<li>
<router-link :to="{ path: '/users/evan', query: { foo: 'bar' }}">
/users/evan?foo=bar
</router-link>
</li>
<li>
<!-- #635 -->
<router-link :to="{ name: 'user', params: { username: 'evan' }, query: { foo: 'bar' }}" exact>
/users/evan?foo=bar (named view exact match)
</router-link>
</li>
<li>
<router-link :to="{ path: '/users/evan', query: { foo: 'bar', baz: 'qux' }}">
/users/evan?foo=baramp;baz=qux
</router-link>
</li>
<li>
<router-link to="/about">/about</router-link>
</li>
<router-link tag="li" to="/about">
<a>/about (active class on outer element)</a>
</router-link>
</ul>
<router-view class="view"></router-view>
</div>