vue 实现导航栏
Vue 实现导航栏的方法
使用 Vue Router 实现基础导航栏
安装 Vue Router 并创建路由配置:
npm install vue-router
创建路由配置文件(如 router/index.js):

import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'
const routes = [
{ path: '/', name: 'Home', component: Home },
{ path: '/about', name: 'About', component: About }
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router
在 App.vue 中实现导航栏组件:
<template>
<nav>
<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>
</nav>
<router-view/>
</template>
<style scoped>
nav {
display: flex;
gap: 1rem;
padding: 1rem;
background: #f0f0f0;
}
.router-link-active {
font-weight: bold;
color: #42b983;
}
</style>
响应式导航栏实现
添加响应式功能,在小屏幕设备上显示汉堡菜单:

<template>
<nav>
<div class="nav-brand">Logo</div>
<button @click="toggleMenu" class="hamburger">☰</button>
<div :class="['nav-links', { 'active': menuOpen }]">
<router-link to="/">Home</router-link>
<router-link to="/about">About</router-link>
</div>
</nav>
</template>
<script>
export default {
data() {
return {
menuOpen: false
}
},
methods: {
toggleMenu() {
this.menuOpen = !this.menuOpen
}
}
}
</script>
<style scoped>
nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
background: #333;
color: white;
}
.nav-links {
display: flex;
gap: 1rem;
}
.hamburger {
display: none;
background: none;
border: none;
color: white;
font-size: 1.5rem;
cursor: pointer;
}
@media (max-width: 768px) {
.hamburger {
display: block;
}
.nav-links {
display: none;
flex-direction: column;
position: absolute;
top: 60px;
left: 0;
width: 100%;
background: #333;
padding: 1rem;
}
.nav-links.active {
display: flex;
}
}
</style>
动态导航栏实现
根据用户权限动态显示导航项:
<template>
<nav>
<router-link v-for="item in visibleNavItems"
:key="item.path"
:to="item.path">
{{ item.name }}
</router-link>
</nav>
</template>
<script>
export default {
computed: {
visibleNavItems() {
const allRoutes = [
{ path: '/', name: 'Home', requiresAuth: false },
{ path: '/dashboard', name: 'Dashboard', requiresAuth: true },
{ path: '/admin', name: 'Admin', requiresAdmin: true }
]
return allRoutes.filter(route => {
if (route.requiresAdmin) {
return this.$store.getters.isAdmin
}
if (route.requiresAuth) {
return this.$store.getters.isAuthenticated
}
return true
})
}
}
}
</script>
导航栏动画效果
为导航栏添加过渡动画:
<template>
<nav>
<transition-group name="nav-item" tag="div" class="nav-container">
<router-link v-for="item in navItems"
:key="item.path"
:to="item.path"
class="nav-link">
{{ item.name }}
</router-link>
</transition-group>
</nav>
</template>
<style scoped>
.nav-container {
display: flex;
gap: 1rem;
}
.nav-link {
transition: all 0.3s ease;
}
.nav-item-enter-active,
.nav-item-leave-active {
transition: all 0.5s ease;
}
.nav-item-enter-from,
.nav-item-leave-to {
opacity: 0;
transform: translateY(-20px);
}
</style>






