当前位置:首页 > VUE

侧边菜单vue实现

2026-01-19 11:50:39VUE

侧边菜单的 Vue 实现方法

在 Vue 中实现侧边菜单可以通过多种方式完成,以下是几种常见的实现方法。

使用 Vue Router 和动态路由

通过 Vue Router 实现侧边菜单,结合动态路由生成菜单项:

侧边菜单vue实现

<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: #f0f0f0;
  height: 100vh;
}
</style>

使用第三方 UI 库

许多流行的 Vue UI 库提供了现成的侧边菜单组件,如 Element UI、Ant Design Vue 等:

<template>
  <el-menu
    default-active="1"
    class="el-menu-vertical"
    background-color="#545c64"
    text-color="#fff"
    active-text-color="#ffd04b">
    <el-menu-item index="1">
      <i class="el-icon-menu"></i>
      <span>首页</span>
    </el-menu-item>
    <el-menu-item index="2">
      <i class="el-icon-document"></i>
      <span>文档</span>
    </el-menu-item>
  </el-menu>
</template>

<script>
import { ElMenu, ElMenuItem } from 'element-plus'

export default {
  components: {
    ElMenu,
    ElMenuItem
  }
}
</script>

可折叠的侧边菜单

实现一个可折叠的侧边菜单,添加展开/收起功能:

侧边菜单vue实现

<template>
  <div class="sidebar" :class="{ 'collapsed': isCollapsed }">
    <button @click="toggleCollapse">
      {{ isCollapsed ? '展开' : '收起' }}
    </button>
    <ul>
      <li v-for="item in menuItems" :key="item.path">
        <router-link :to="item.path">
          <i :class="item.icon"></i>
          <span v-if="!isCollapsed">{{ item.title }}</span>
        </router-link>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isCollapsed: false,
      menuItems: [
        { path: '/home', title: '首页', icon: 'fa fa-home' },
        { path: '/about', title: '关于', icon: 'fa fa-info' }
      ]
    }
  },
  methods: {
    toggleCollapse() {
      this.isCollapsed = !this.isCollapsed
    }
  }
}
</script>

<style>
.sidebar {
  width: 200px;
  transition: width 0.3s;
}
.sidebar.collapsed {
  width: 60px;
}
</style>

响应式侧边菜单

实现一个响应式的侧边菜单,在小屏幕设备上自动隐藏:

<template>
  <div>
    <button @click="toggleMenu" class="menu-toggle">菜单</button>
    <div class="sidebar" :class="{ 'active': isMenuActive }">
      <ul>
        <li v-for="item in menuItems" :key="item.path">
          <router-link :to="item.path">{{ item.title }}</router-link>
        </li>
      </ul>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      isMenuActive: false,
      menuItems: [
        { path: '/home', title: '首页' },
        { path: '/about', title: '关于' }
      ]
    }
  },
  methods: {
    toggleMenu() {
      this.isMenuActive = !this.isMenuActive
    }
  }
}
</script>

<style>
.menu-toggle {
  display: none;
}
.sidebar {
  width: 250px;
}
@media (max-width: 768px) {
  .menu-toggle {
    display: block;
  }
  .sidebar {
    display: none;
    position: fixed;
    top: 0;
    left: 0;
    height: 100vh;
    background: #fff;
    z-index: 1000;
  }
  .sidebar.active {
    display: block;
  }
}
</style>

嵌套菜单实现

对于多级菜单,可以使用递归组件实现:

<template>
  <div class="sidebar">
    <ul>
      <li v-for="item in menuItems" :key="item.path">
        <template v-if="item.children">
          <div @click="toggleSubMenu(item)">
            {{ item.title }}
            <span>{{ item.isOpen ? '-' : '+' }}</span>
          </div>
          <ul v-show="item.isOpen">
            <li v-for="child in item.children" :key="child.path">
              <router-link :to="child.path">{{ child.title }}</router-link>
            </li>
          </ul>
        </template>
        <template v-else>
          <router-link :to="item.path">{{ item.title }}</router-link>
        </template>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      menuItems: [
        {
          title: '产品',
          isOpen: false,
          children: [
            { path: '/product/a', title: '产品A' },
            { path: '/product/b', title: '产品B' }
          ]
        },
        { path: '/about', title: '关于' }
      ]
    }
  },
  methods: {
    toggleSubMenu(item) {
      item.isOpen = !item.isOpen
    }
  }
}
</script>

以上方法提供了从基础到高级的侧边菜单实现方案,可以根据项目需求选择合适的实现方式。

标签: 侧边菜单
分享给朋友:

相关文章

css制作横向菜单

css制作横向菜单

使用浮动(Float)实现横向菜单 将菜单项的 display 属性设置为 float: left,使列表项横向排列。清除浮动避免影响后续布局。 ul.horizontal-menu { lis…

vue 实现菜单

vue 实现菜单

Vue 实现菜单的方法 在 Vue 中实现菜单功能可以通过多种方式完成,以下是一些常见的方法: 使用 Vue Router 实现路由菜单 通过 Vue Router 可以轻松实现基于路由的菜单导航。…

vue elementui实现菜单

vue elementui实现菜单

使用 Vue 和 Element UI 实现菜单 Element UI 提供了 el-menu 组件,可以轻松实现导航菜单功能。以下是一个完整的实现示例: 安装 Element UI 确保项目已安装…

react如何实现菜单

react如何实现菜单

使用 React 实现菜单的方法 使用状态管理控制菜单显示/隐藏 通过 useState 管理菜单的展开和收起状态,结合点击事件切换状态。 import { useState } from 'rea…

vue实现菜单联动

vue实现菜单联动

实现菜单联动的基本思路 在Vue中实现菜单联动通常涉及父子组件通信或状态管理。核心是通过数据绑定和事件监听,确保一个菜单的选择能触发另一个菜单的更新。 数据准备与结构设计 定义菜单数据时,建议使用嵌…

vue实现菜单权限

vue实现菜单权限

基于路由的动态菜单权限控制 在Vue中实现菜单权限通常需要结合路由配置和用户角色/权限数据。以下是常见的实现方法: 路由配置中添加权限标识 // router.js const routes =…