element el-menu动态菜单

这个博客展示了如何使用Vue.js创建一个无限级菜单组件。通过`v-for`指令和递归组件`MenuTree`实现了菜单的动态展开,并且监听了菜单项的点击事件,传递数据到父组件。组件中包含了样式定义,确保选中状态的视觉效果。数据结构包含多级菜单项,每个菜单项可能有子菜单项,形成一个多级导航结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子组件: 

    <template>
    <div>
        <template v-for="(item,index) in menuList">
        <!-- 有次级菜单的,则展开子选项-->
        <el-submenu v-if="item.children && item.children.length>0" :key="index" :index="item.id">
            <template #title>
            <!-- <el-icon v-if="item.icon!=''"><component :is="item.icon" /></el-icon> -->
                <span >{{item.name}}</span>
            </template>
            <!-- 递归,实现无限级展开 -->
            <MenuTree :menuList="item.children" @childEvent="chosedMenu" :key="index" ></MenuTree>
        </el-submenu>
        <!-- 没有次级菜单的 -->
        <el-menu-item  v-if="!item.children" :key="index" @click="routerGo(item,index)" :index='item.remark' :class="activeMenu==index?'activeMenu':''" >
            <!-- <el-icon v-if="item.icon!=''"><component :is="item.icon" /></el-icon> -->
            <span >{{item.name}}</span>
        </el-menu-item>
        </template>
    </div>
    </template>
    
    <script>

    export default {
        name: 'MenuTree',
        props:{
            menuList:{
                type:Array,
                default(){
                    return []
                }
            }
        },
        data(){
            return{
                chosed:'',
            }
        },
        mounted(){
            // console.log(this.menuList,'123');
            //  this.$emit('childEvent',i)
        },
        methods: {
            // 菜单点击的操作
            routerGo(i,index){
                console.log(i,index);
                this.$emit('childEvent',i)
                this.chosed = index
            },
            // 接受本身组件传来的参数,然后将传来得值,发送到外层父组件
            chosedMenu(i){
                this.$emit('childEvent',i)
            },

        }
    }
    </script>
    <style scoped lang='scss'>
   .activeMenu{
    color: #fff !important;
    background: #2055b0 !important;
   }
    /* 菜单栏选中后背景色 */
    .el-menu-item {
        color: #ffffff;
    } 
    .el-menu-item.is-active {
        color: #fff;
        background: #2055b0 !important;
    }	

/*选中菜单后的操作*/
     .is-active {
        background: #2055b0 !important;
      }
    </style>

父组件:

 <el-menu 
              :default-active='menuList[0].remark'
              class="el-menu-vertical-demo"
              text-color="rgb(195, 200, 203)"
              background-color="#192654"
              active-text-color="#fff"
              :unique-opened="true"
              
					   >
				      <MenuTree :menuList="menuList" @childEvent="chosedMenu"></MenuTree>
				    </el-menu>

数据:

menuList:[
            {
            id:1,
            parentid:'0',
            name:'测试菜单',
            icon:'HomeFilled',
            remark: 'loadbusi/workSys/workOrder',
            },
            {
              id:2,
              parentid:'0',
              name:'实训室',
              icon:'UserFilled',
              children:[
                  {
                    id:3,
                    parentid:'2',
                    name:'测试菜单1',
                    icon:'',
                    children:[
                      {
                        id:4,
                        parentid:'2',
                        name:'测试菜单1-1',
                        icon:'',
                        remark: 'loadbusi/workSys/workTotal',

                      }
                    ]
                  },
                  {
                    id:5,
                    parentid:'2',
                    name:'测试菜单2',
                    icon:'',
                    remark: 'loadbusi/emergency/demandManage',
                  }
                ]
            },
	  ],

### Element UI 中 el-menu-item 点击事件的使用方法 在 Element UI 的 `el-menu` 组件中,可以通过监听 `@select` 事件来捕获用户点击菜单项的操作。`@select` 事件会在用户点击某个菜单项时触发,并将被点击菜单项的 `index` 属性值作为参数传递给事件处理函数[^1]。 以下是一个完整的示例,展示如何为 `el-menu-item` 添加点击事件并处理相关逻辑: ```vue <template> <el-menu :default-active="activeIndex" class="el-menu-vertical-demo" @select="handleSelect" > <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-submenu index="3"> <template slot="title"> <i class="el-icon-location"></i> <span>选项三</span> </template> <el-menu-item-group title="分组一"> <el-menu-item index="3-1">分组一 选项A</el-menu-item> <el-menu-item index="3-2">分组一 选项B</el-menu-item> </el-menu-item-group> <el-menu-item-group title="分组二"> <el-menu-item index="3-3">分组二 选项C</el-menu-item> </el-menu-item-group> </el-submenu> </el-menu> </template> <script> export default { data() { return { activeIndex: '1', // 默认选中的菜单项 }; }, methods: { handleSelect(index) { console.log('点击的菜单项索引:', index); if (index === '1') { this.$message.success('您选择了选项一'); } else if (index === '2') { this.$message.success('您选择了选项二'); } else { this.$message.success(`您选择了选项三下的子菜单: ${index}`); } }, }, }; </script> ``` #### 关键点解析 1. **`@select` 事件**:`el-menu` 组件支持一个名为 `@select` 的事件,当用户点击任意一个菜单项(包括 `el-menu-item` 和 `el-submenu`)时会触发该事件[^1]。 2. **`index` 属性**:每个 `el-menu-item` 或 `el-submenu` 都需要设置唯一的 `index` 属性,用于标识具体的菜单项。`@select` 事件的回调函数会接收到这个 `index` 值。 3. **动态交互**:通过在 `@select` 的回调函数中编写逻辑,可以实现对不同菜单项点击时的不同响应。 此外,如果需要在页面刷新后保持菜单的选中状态,可以通过 `:default-active="$route.path"` 动态绑定当前路由路径来实现[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值