您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # Vue如何设置导航栏、侧边栏为公共页面
## 前言
在Vue项目开发中,导航栏(Navbar)和侧边栏(Sidebar)是绝大多数管理系统和内容型网站的基础组件。将这些组件设置为公共页面可以避免重复代码,提高开发效率,同时保持整个应用风格的一致性。本文将详细介绍在Vue 2和Vue 3项目中如何实现这一功能。
## 一、基础项目结构搭建
### 1.1 创建Vue项目
```bash
# Vue CLI创建项目
vue create my-project
# 或使用Vite创建Vue 3项目
npm create vite@latest my-project --template vue
src/
├── assets/
├── components/
│   ├── layout/
│   │   ├── Navbar.vue
│   │   ├── Sidebar.vue
│   │   └── AppLayout.vue
├── views/
├── App.vue
└── main.js
<template>
  <nav class="navbar">
    <div class="navbar-brand">
      <router-link to="/">My App</router-link>
    </div>
    <ul class="navbar-menu">
      <li><router-link to="/home">首页</router-link></li>
      <li><router-link to="/about">关于</router-link></li>
    </ul>
  </nav>
</template>
<script>
export default {
  name: 'Navbar'
}
</script>
<style scoped>
.navbar {
  background-color: #2c3e50;
  color: white;
  padding: 1rem;
  display: flex;
  justify-content: space-between;
}
</style>
<template>
  <aside class="sidebar">
    <ul>
      <li v-for="item in menuItems" :key="item.path">
        <router-link :to="item.path">{{ item.title }}</router-link>
      </li>
    </ul>
  </aside>
</template>
<script>
export default {
  name: 'Sidebar',
  data() {
    return {
      menuItems: [
        { path: '/dashboard', title: '仪表盘' },
        { path: '/settings', title: '设置' }
      ]
    }
  }
}
</script>
<template>
  <div class="app-layout">
    <Navbar />
    <div class="main-container">
      <Sidebar />
      <main class="content">
        <router-view />
      </main>
    </div>
  </div>
</template>
<script>
import Navbar from './Navbar.vue'
import Sidebar from './Sidebar.vue'
export default {
  name: 'AppLayout',
  components: { Navbar, Sidebar }
}
</script>
<style>
.app-layout {
  display: flex;
  flex-direction: column;
  height: 100vh;
}
.main-container {
  display: flex;
  flex: 1;
}
.content {
  flex: 1;
  padding: 20px;
}
</style>
<template>
  <div id="app">
    <router-view v-if="$route.meta.requiresLayout" />
    <app-layout v-else>
      <router-view />
    </app-layout>
  </div>
</template>
<script>
import AppLayout from './components/layout/AppLayout.vue'
export default {
  components: { AppLayout }
}
</script>
<template>
  <nav class="navbar">
    <!-- 内容同Vue 2版本 -->
  </nav>
</template>
<script setup>
// 使用script setup语法
</script>
<template>
  <component :is="layout">
    <router-view />
  </component>
</template>
<script setup>
import { computed } from 'vue'
import { useRoute } from 'vue-router'
import AppLayout from './components/layout/AppLayout.vue'
import EmptyLayout from './components/layout/EmptyLayout.vue'
const route = useRoute()
const layout = computed(() => {
  return route.meta.layout || 'app-layout'
})
const layouts = {
  'app-layout': AppLayout,
  'empty-layout': EmptyLayout
}
</script>
import Vue from 'vue'
import Router from 'vue-router'
import Home from '../views/Home.vue'
import Login from '../views/Login.vue'
Vue.use(Router)
export default new Router({
  routes: [
    {
      path: '/login',
      component: Login,
      meta: { requiresLayout: false }
    },
    {
      path: '/',
      component: Home,
      meta: { requiresLayout: true }
    }
  ]
})
{
  path: '/admin',
  component: AppLayout,
  children: [
    {
      path: 'dashboard',
      component: Dashboard
    },
    {
      path: 'settings',
      component: Settings
    }
  ]
}
// store/modules/layout.js
export default {
  state: {
    sidebarCollapsed: false
  },
  mutations: {
    TOGGLE_SIDEBAR(state) {
      state.sidebarCollapsed = !state.sidebarCollapsed
    }
  },
  actions: {
    toggleSidebar({ commit }) {
      commit('TOGGLE_SIDEBAR')
    }
  }
}
<template>
  <button @click="toggleSidebar">
    {{ sidebarCollapsed ? '展开' : '折叠' }}
  </button>
</template>
<script>
import { mapState, mapActions } from 'vuex'
export default {
  computed: {
    ...mapState('layout', ['sidebarCollapsed'])
  },
  methods: {
    ...mapActions('layout', ['toggleSidebar'])
  }
}
</script>
// 根据权限生成菜单
function generateMenu(userRole) {
  const allRoutes = [
    { path: '/dashboard', title: '仪表盘', roles: ['admin', 'user'] },
    { path: '/admin', title: '管理', roles: ['admin'] }
  ]
  
  return allRoutes.filter(route => 
    route.roles.includes(userRole)
  )
}
/* 移动端适配 */
@media (max-width: 768px) {
  .main-container {
    flex-direction: column;
  }
  
  .sidebar {
    width: 100%;
    height: auto;
  }
}
<template>
  <transition name="slide-fade">
    <sidebar v-if="showSidebar" />
  </transition>
</template>
<style>
.slide-fade-enter-active {
  transition: all 0.3s ease-out;
}
.slide-fade-leave-active {
  transition: all 0.3s cubic-bezier(1, 0.5, 0.8, 1);
}
.slide-fade-enter-from,
.slide-fade-leave-to {
  transform: translateX(-100%);
  opacity: 0;
}
</style>
<template>
  <li :class="{ 'active': isActive(item.path) }">
    <router-link :to="item.path">{{ item.title }}</router-link>
  </li>
</template>
<script>
export default {
  methods: {
    isActive(path) {
      return this.$route.path.startsWith(path)
    }
  }
}
</script>
router.beforeEach((to, from, next) => {
  const requiresAuth = to.matched.some(record => record.meta.requiresAuth)
  const user = store.state.user
  
  if (requiresAuth && !user) {
    next('/login')
  } else {
    next()
  }
})
本文详细介绍了在Vue项目中实现公共导航栏和侧边栏的多种方法:
通过这些技术,你可以构建出结构清晰、易于维护的Vue应用架构。根据项目需求选择适合的方案,并不断优化用户体验。
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。