当前位置:首页 > VUE

vue实现侧导航

2026-02-10 17:43:22VUE

Vue 实现侧边导航

使用 Vue Router 和动态组件

在 Vue 中实现侧边导航可以通过结合 Vue Router 和动态组件来完成。以下是一个基本实现方法:

<template>
  <div class="sidebar">
    <ul>
      <li v-for="item in menuItems" :key="item.path">
        <router-link :to="item.path">{{ item.title }}</router-link>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      menuItems: [
        { path: '/home', title: '首页' },
        { path: '/about', title: '关于' },
        { path: '/contact', title: '联系我们' }
      ]
    }
  }
}
</script>

<style>
.sidebar {
  width: 200px;
  background: #f5f5f5;
  height: 100vh;
  position: fixed;
  left: 0;
  top: 0;
}

.sidebar ul {
  list-style: none;
  padding: 0;
}

.sidebar li {
  padding: 10px 15px;
}

.sidebar a {
  text-decoration: none;
  color: #333;
}

.sidebar a.router-link-exact-active {
  color: #42b983;
  font-weight: bold;
}
</style>

使用 Element UI 的导航组件

如果项目中使用了 Element UI,可以利用其提供的导航组件快速实现:

vue实现侧导航

<template>
  <el-menu
    default-active="1"
    class="el-menu-vertical"
    background-color="#545c64"
    text-color="#fff"
    active-text-color="#ffd04b">
    <el-submenu index="1">
      <template slot="title">
        <i class="el-icon-location"></i>
        <span>导航一</span>
      </template>
      <el-menu-item-group>
        <el-menu-item index="1-1">选项1</el-menu-item>
        <el-menu-item index="1-2">选项2</el-menu-item>
      </el-menu-item-group>
    </el-submenu>
    <el-menu-item index="2">
      <i class="el-icon-menu"></i>
      <span>导航二</span>
    </el-menu-item>
  </el-menu>
</template>

<script>
export default {
  methods: {
    handleOpen(key, keyPath) {
      console.log(key, keyPath);
    },
    handleClose(key, keyPath) {
      console.log(key, keyPath);
    }
  }
}
</script>

响应式侧边导航

实现一个可以折叠展开的响应式侧边导航:

<template>
  <div class="sidebar-container" :class="{ 'collapsed': isCollapsed }">
    <div class="toggle-btn" @click="isCollapsed = !isCollapsed">
      {{ isCollapsed ? '>' : '<' }}
    </div>
    <nav>
      <router-link v-for="item in menuItems" :key="item.path" :to="item.path">
        <i :class="item.icon"></i>
        <span v-show="!isCollapsed">{{ item.title }}</span>
      </router-link>
    </nav>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isCollapsed: false,
      menuItems: [
        { path: '/dashboard', title: '仪表盘', icon: 'el-icon-s-home' },
        { path: '/users', title: '用户管理', icon: 'el-icon-user' },
        { path: '/settings', title: '设置', icon: 'el-icon-setting' }
      ]
    }
  }
}
</script>

<style>
.sidebar-container {
  width: 200px;
  height: 100vh;
  background: #304156;
  transition: width 0.3s;
  position: relative;
}

.sidebar-container.collapsed {
  width: 64px;
}

.toggle-btn {
  color: white;
  text-align: center;
  padding: 10px;
  cursor: pointer;
}

nav {
  padding-top: 20px;
}

nav a {
  display: block;
  color: #bfcbd9;
  padding: 12px 20px;
  text-decoration: none;
}

nav a:hover {
  background: #263445;
}

nav a.router-link-exact-active {
  background: #263445;
  color: #409EFF;
}

nav i {
  margin-right: 10px;
}
</style>

使用 Vuex 管理导航状态

对于大型应用,可以使用 Vuex 来管理侧边导航的状态:

vue实现侧导航

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    sidebarOpen: true
  },
  mutations: {
    toggleSidebar(state) {
      state.sidebarOpen = !state.sidebarOpen
    }
  }
})

在组件中使用:

<template>
  <div class="sidebar" :class="{ 'collapsed': !sidebarOpen }">
    <button @click="toggleSidebar">切换</button>
    <!-- 导航内容 -->
  </div>
</template>

<script>
import { mapState, mapMutations } from 'vuex'

export default {
  computed: {
    ...mapState(['sidebarOpen'])
  },
  methods: {
    ...mapMutations(['toggleSidebar'])
  }
}
</script>

动态权限控制导航

根据用户权限动态生成导航菜单:

// 在组件中
export default {
  data() {
    return {
      menuItems: []
    }
  },
  created() {
    this.generateMenuBasedOnPermissions()
  },
  methods: {
    generateMenuBasedOnPermissions() {
      const userPermissions = this.$store.getters.permissions

      const allMenuItems = [
        { path: '/dashboard', title: '仪表盘', permission: 'view_dashboard' },
        { path: '/admin', title: '管理', permission: 'admin_access' },
        { path: '/reports', title: '报告', permission: 'view_reports' }
      ]

      this.menuItems = allMenuItems.filter(item => 
        userPermissions.includes(item.permission)
      )
    }
  }
}

标签: vue
分享给朋友:

相关文章

vue实现图册

vue实现图册

Vue实现图册功能 在Vue中实现图册功能通常涉及图片展示、切换、缩放等交互效果。以下是常见的实现方法和关键代码示例: 基础图册组件结构 使用Vue单文件组件构建基础结构: <templat…

vue实现toast

vue实现toast

Vue 实现 Toast 的方法 使用第三方库(推荐) 对于快速实现 Toast 功能,推荐使用成熟的第三方库如 vue-toastification 或 vant 的 Toast 组件。 安装 v…

vue实现 hover

vue实现 hover

实现 Vue 中的 hover 效果 在 Vue 中实现 hover 效果可以通过多种方式完成,以下是常见的几种方法: 使用 CSS 伪类 最简单的方式是直接使用 CSS 的 :hover 伪类,无…

vue实现popper

vue实现popper

Vue 实现 Popper 的方法 使用 Tippy.js 库 Tippy.js 是一个轻量级的 Popper.js 封装库,提供丰富的工具提示功能。安装 Tippy.js 及其 Vue 封装: n…

vue实现checkbox

vue实现checkbox

Vue 实现 Checkbox 在 Vue 中实现 Checkbox 可以通过原生 HTML 的 <input type="checkbox"> 或使用 Vue 的 v-model 指令绑…

vue数据劫持实现

vue数据劫持实现

Vue 数据劫持的实现原理 Vue 的数据劫持主要通过 Object.defineProperty 或 Proxy 实现,用于监听数据变化并触发视图更新。以下是核心实现方式: 使用 Object.d…