当前位置:首页 > VUE

如何vue实现动态菜单

2026-01-22 08:11:36VUE

Vue 实现动态菜单的方法

使用路由配置动态菜单

在 Vue 项目中,可以通过路由配置动态生成菜单。路由配置通常存储在 router/index.js 中,菜单数据可以根据路由信息动态渲染。

// router/index.js
const routes = [
  {
    path: '/dashboard',
    name: 'Dashboard',
    meta: { title: 'Dashboard', icon: 'el-icon-menu' }
  },
  {
    path: '/user',
    name: 'User',
    meta: { title: 'User Management', icon: 'el-icon-user' }
  }
]

在组件中通过 this.$router.options.routes 获取路由配置,动态渲染菜单:

<template>
  <div>
    <el-menu>
      <el-menu-item 
        v-for="route in routes" 
        :key="route.name"
        :index="route.path"
      >
        <i :class="route.meta.icon"></i>
        <span>{{ route.meta.title }}</span>
      </el-menu-item>
    </el-menu>
  </div>
</template>

<script>
export default {
  computed: {
    routes() {
      return this.$router.options.routes
    }
  }
}
</script>

从后端 API 获取菜单数据

动态菜单数据通常由后端返回,通过 API 请求获取菜单数据后渲染。

// 假设 API 返回格式如下
[
  { path: '/dashboard', name: 'Dashboard', meta: { title: 'Dashboard', icon: 'icon-dashboard' } },
  { path: '/user', name: 'User', meta: { title: 'User', icon: 'icon-user' } }
]

在 Vue 组件中调用 API 并渲染菜单:

如何vue实现动态菜单

<template>
  <div>
    <el-menu>
      <el-menu-item 
        v-for="item in menuList" 
        :key="item.name"
        :index="item.path"
      >
        <i :class="item.meta.icon"></i>
        <span>{{ item.meta.title }}</span>
      </el-menu-item>
    </el-menu>
  </div>
</template>

<script>
import { getMenuList } from '@/api/menu'

export default {
  data() {
    return {
      menuList: []
    }
  },
  created() {
    this.fetchMenuData()
  },
  methods: {
    async fetchMenuData() {
      const { data } = await getMenuList()
      this.menuList = data
    }
  }
}
</script>

使用 Vuex 管理菜单状态

对于复杂的应用,可以使用 Vuex 集中管理菜单状态,方便全局共享和更新。

// store/modules/menu.js
const state = {
  menuList: []
}

const mutations = {
  SET_MENU_LIST(state, list) {
    state.menuList = list
  }
}

const actions = {
  async fetchMenuList({ commit }) {
    const { data } = await getMenuList()
    commit('SET_MENU_LIST', data)
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

在组件中通过 Vuex 获取和更新菜单数据:

如何vue实现动态菜单

<template>
  <div>
    <el-menu>
      <el-menu-item 
        v-for="item in menuList" 
        :key="item.name"
        :index="item.path"
      >
        <i :class="item.meta.icon"></i>
        <span>{{ item.meta.title }}</span>
      </el-menu-item>
    </el-menu>
  </div>
</template>

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

export default {
  computed: {
    ...mapState('menu', ['menuList'])
  },
  created() {
    this.fetchMenuList()
  },
  methods: {
    ...mapActions('menu', ['fetchMenuList'])
  }
}
</script>

递归渲染多级菜单

如果菜单包含多级嵌套结构,可以通过递归组件实现。

定义递归组件 SubMenu.vue

<template>
  <el-submenu :index="item.path">
    <template #title>
      <i :class="item.meta.icon"></i>
      <span>{{ item.meta.title }}</span>
    </template>
    <template v-for="child in item.children">
      <sub-menu 
        v-if="child.children" 
        :key="child.path" 
        :item="child"
      />
      <el-menu-item v-else :key="child.path" :index="child.path">
        <i :class="child.meta.icon"></i>
        <span>{{ child.meta.title }}</span>
      </el-menu-item>
    </template>
  </el-submenu>
</template>

<script>
export default {
  name: 'SubMenu',
  props: {
    item: {
      type: Object,
      required: true
    }
  }
}
</script>

在主菜单组件中使用递归组件:

<template>
  <el-menu>
    <template v-for="item in menuList">
      <sub-menu v-if="item.children" :key="item.path" :item="item" />
      <el-menu-item v-else :key="item.path" :index="item.path">
        <i :class="item.meta.icon"></i>
        <span>{{ item.meta.title }}</span>
      </el-menu-item>
    </template>
  </el-menu>
</template>

<script>
import SubMenu from './SubMenu'

export default {
  components: { SubMenu },
  computed: {
    ...mapState('menu', ['menuList'])
  }
}
</script>

注意事项

  • 确保菜单数据的 path 与路由配置一致,否则导航可能失效。
  • 对于权限控制,可以在菜单数据或路由配置中添加 roles 字段,过滤无权限的菜单项。
  • 图标可以使用字体图标(如 Element UI 的图标)或自定义 SVG 图标。

标签: 菜单动态
分享给朋友:

相关文章

css菜单制作

css菜单制作

基础水平菜单制作 使用无序列表<ul>和<li>标签构建结构,CSS设置横向排列: <ul class="horizontal-menu"> <li&g…

vue实现下拉菜单

vue实现下拉菜单

实现下拉菜单的基本结构 使用 Vue 的 v-show 或 v-if 控制下拉菜单的显示与隐藏。通过点击按钮或父元素触发下拉状态切换。 <template> <div cl…

vue实现动态配置地址

vue实现动态配置地址

动态配置地址的实现方法 在Vue项目中实现动态配置地址可以通过环境变量、API请求或配置文件等方式完成。以下是几种常见方法: 使用环境变量 创建.env文件存储基础URL,不同环境使用不同文件:…

vue 实现动态样式

vue 实现动态样式

动态样式绑定方法 在Vue中实现动态样式主要通过v-bind:class和v-bind:style指令完成,以下是具体实现方式: 类名绑定 <div :class="{ active: is…

vue菜单tab实现

vue菜单tab实现

Vue 菜单 Tab 实现方法 使用动态组件切换内容 通过 Vue 的 component 动态组件结合 v-for 渲染菜单项,点击时切换显示内容: <template> <…

js实现菜单

js实现菜单

实现基本HTML结构 使用HTML创建菜单的基本框架,通常包含<ul>和<li>元素。示例结构如下: <ul id="menu"> <li><…