vue 动态菜单

本文详细介绍了如何使用Vue.js实现动态菜单功能,核心在于创建一个递归组件`SidebarItem.vue`,根据后端传来的菜单数据自动生成菜单结构。组件通过条件渲染处理不同层级的菜单项,并在父组件`Sidebar.vue`中进行调用,接收并传递菜单数据。在实际应用中,可以从后端获取数据,然后传递给父组件完成动态菜单的渲染。确保正确引用子组件并处理好父子组件间的路径问题。
摘要由CSDN通过智能技术生成

前言

前一篇文章中有说到,动态路由配合动态菜单使用有奇效
我在这里在做一篇动态菜单的博客
首先来说,动态菜单的核心便是编写一个递归组件,以达到根据后端传递过来的菜单集合自动生成菜单

组件介绍

首先这个递归组件是来自ETZHOU的手笔,我后续根据我自己的需求进行了调整,各位在使用的时候可以根据自身需求去调整内容.

1、子组件SidebarItem.vue

<template>
  <div v-if="item.children">
    <template v-if="item.children.length == 0">
        <el-menu-item :index="itemPath+'/'+item.path" :disabled="item.delFlag ==1">
          <i :class="item.icon"></i>
          <span>{{item.name}}</span>
        </el-menu-item>
    </template>

    <el-submenu v-else :index="itemPath+'/'+item.path">
      <template slot="title" >
        <i :class="item.icon"></i>
        <span>{{item.name}}</span>
      </template>

      <template v-for="child in item.children">
        <sidebar-item
          v-if="child.children&&child.children.length>0"
          :item="child"
          :rootName="rootName" :rootPath="itemPath"
          :key="child.path"/>
        <el-menu-item v-else :key="child.path" :index="itemPath+'/'+child.path" :disabled="child.delFlag == 1">
          <i :class="child.icon"></i>
          <span>{{child.name}}</span>
        </el-menu-item>
      </template>
    </el-submenu>
  </div>
  <div v-else>
      <el-menu-item :index="itemPath+'/'+item.path" :disabled="item.delFlag ==1">
        <i :class="item.icon"></i>
        <span>{{item.name}}</span>
      </el-menu-item>
  </div>
</template>

<script>
export default {
  name: 'SidebarItem',
  props: {
    item: {
      type: Object,
      required: true
    },
    rootName: {
      type: String,
      required: true
    },
    rootPath: {
      type: String,
      required: true
    }
  },
  data(){
    return{
      itemPath:''
    }
  },
  created() {
    this.itemPath = this.rootPath +'/'+ this.item.path
  }
}
</script>

子组件是动态菜单的核心逻辑,通过v-if和v-else、v-else-if操作判断菜单是否还有下层

2、父组件Sidebar.vue

<template>
  <div class="sidebar-container">
    <el-scrollbar wrap-class="scrollbar-wrapper">
      <el-menu style="font: 20px '楷体'; "
        default-active="2"
        class="el-menu-vertical-demo"
        unique-opened
        router
        background-color="#545c64"
        text-color="#bfcbd9"
        active-text-color="#409EFF">
      <sidebar-item v-for="menu in menuList" :key="menu.path" :item="menu" :rootName="''" :rootPath="''"/>
    </el-menu>
  </el-scrollbar>
  </div>
</template>
<script>
import SidebarItem from './SidebarItem.vue'
export default {
  name: 'Sidebar',
  components: { SidebarItem },
  props: {
    menuList: {
      type: Array,
      required: true
    }
  },
}
</script>
<style lang="less" scoped>
</style>

这里是父组件Sidebar.vue,将父组件引入你的页面中,给他传递对应的参数 menuList 便可成功引用
注意: 若直接复制代码不做修改请将父子组件放在同一个文件夹下,若是不在同一个文件夹请修改父组件中对子组件的引用。

引用

这里就更加简单了

<template>
    <div>
        <side-bar :menuList="menuList" />
    </div>
</template>

<script>
    import SideBar from "../SideBar/SideBar";
    import menu from "../../api/menu";
    export default {
        name: "backIndex",
        data(){
            return {
                menuList: [],
            }
        },
        methods:{
            queryMenus () {
                menu.getList().then(resp =>{
                    this.menuList = resp.data.data
                    //保存到仓库
                    this.$store.commit('addMenu', this.menuList)
                })
            },
        },
        mounted() {
            this.queryMenus()
        },
        components: { SideBar, },
    }
</script>

<style scoped>

</style>

直接从后端获取数据后直接传递进父组件中即可

后端支持

后端数据结构请看
vue动态路由
最后的后端支持

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vue 2中实现动态菜单权限控制可以通过以下步骤进行: 1. 定义菜单数据结构:创建一个包含菜单项的数据结构,可以使用对象数组或者树形结构。 2. 获取用户权限:从后端或者其他途径获取当前用户的权限信息。 3. 根据权限过滤菜单:根据用户权限,遍历菜单数据结构,过滤掉用户没有权限的菜单项。 4. 渲染动态菜单:使用Vue的条件渲染指令(v-if或v-show)根据菜单项是否有权限来显示或隐藏对应的菜单项。 以下是一个示例代码片段,展示了如何在Vue 2中实现动态菜单权限控制: ```html <template> <div> <ul> <li v-for="item in menu" :key="item.id" v-if="hasPermission(item)"> {{ item.name }} </li> </ul> </div> </template> <script> export default { data() { return { menu: [ { id: 1, name: 'Home', permission: 'home' }, { id: 2, name: 'About', permission: 'about' }, { id: 3, name: 'Contact', permission: 'contact' }, ], userPermissions: ['home', 'contact'], // 假设当前用户拥有的权限 }; }, methods: { hasPermission(item) { return this.userPermissions.includes(item.permission); }, }, }; </script> ``` 在上述示例中,`menu`数组包含了所有的菜单项,每个菜单项都有一个`permission`属性表示该菜单项的权限。`userPermissions`数组表示当前用户拥有的权限。 通过`v-for`遍历`menu`数组,使用`v-if`指令结合`hasPermission`方法判断当前用户是否有权限访问该菜单项,只有有权限的菜单项才会被渲染出来。 需要注意的是,这只是一个简单的示例,实际应用中可能需要更复杂的权限管理方案。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值