当前位置:首页 > 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 图标。

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

相关文章

vue发布动态功能实现

vue发布动态功能实现

实现Vue动态发布功能 前端实现 使用Vue.js构建动态发布表单,包含文本输入和图片上传功能 <template> <div> <textarea v-m…

vue菜单实现

vue菜单实现

Vue 菜单实现方法 使用 Element UI 的菜单组件 Element UI 提供了现成的菜单组件,适合快速实现导航菜单。安装 Element UI 后,可以直接使用 el-menu 相关组件。…

css菜单制作

css菜单制作

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

vue动态组建实现原理

vue动态组建实现原理

Vue动态组件的实现原理 Vue的动态组件主要通过<component>标签和is属性实现,其核心原理涉及以下机制: 动态组件基础语法 <component :is="curren…

vue实现动态显示页面

vue实现动态显示页面

动态显示页面的实现方法 在Vue中实现动态显示页面通常涉及数据绑定、条件渲染、列表渲染以及动态组件等技术。以下是几种常见的实现方式: 数据驱动视图 Vue的核心思想是数据驱动视图,通过修改数据自动更…

vue实现微博发布动态

vue实现微博发布动态

Vue 实现微博发布动态功能 数据绑定与表单设计 使用 Vue 的 v-model 实现表单双向绑定,创建动态内容输入框和图片上传组件。示例代码: <template> <d…