关于vue优雅地使用ElementUI以及Ant-Design-Vue等UI框架的n层嵌套菜单设计

两层嵌套的菜单实现

两年前在上一家公司里面设计系统时,自行写了一个菜单,类似这样
在这里插入图片描述
由于当时的菜单比较简单,只有父子两层嵌套,因此代码也很简单,直接在template标签中使用两个for循环渲染出来,类似这样(当时使用的AntDesignVue的框架,由于他的menu组件卡顿太严重了,于是重新写的菜单组件)。
在这里插入图片描述
现在业务情况有些复杂了,子菜单里面还有子菜单,可能会出现好几层,但是不知道到底有几层,这可把鼠鼠难住了,咋办捏?
一开始想到使用component动态组件渲染,但是还是得写死固定几层,不行,像鼠鼠这么优雅的人,怎么能写出如此狼狈的代码.

多层嵌套复杂菜单的实现

我知道你很急,但是你先别急,先看看VUE文档中所描述的,说明template模板渲染并不是万能。
在这里插入图片描述
在有些时候,我们不得不做一些改变,在Render渲染函数中,也可以使用JSX。
在这里插入图片描述
这个时候,鼠鼠仿佛抓住了救命稻草,一道刺眼的光线照在了鼠鼠的身上,于是,写下了这段render函数代码。

render(h){
    const menuList = this.handlerMenu() // 多层嵌套的菜单配置列表
    let menuId = [] // 存放每个菜单的ID,做为每个菜单的唯一标识
    const fn = (menus)=>{
      return menus.map((x,i)=>{
        menuId.push(i) // 保存当前ID
        let result = '' // 存放节点的变量
        if(!x.submenu){ // 假如没有子菜单
          result = <el-menu-item onClick={()=>{this.open(x)}} index={menuId.join("-")}>
            <template slot="title">{x.title}</template>
            </el-menu-item>
        }else{
          result = <el-submenu index={menuId.join("-")}>
            <template slot="title">{x.title}</template>
            {fn(x.submenu)}  {/*这个递归就能解决多层嵌套的问题了*/}
            </el-submenu>
        }
        menuId.pop() // 每次将最后一个id干掉,保证每个子菜单的id与上一层关联
        return result
      })
    }
    return (<el-aside>
      <el-submenu index={menuId.join("-")}>
        {fn(menuList)}  {/*梦开始的地方*/}
        </el-submenu>
    </el-aside>)
  },

在这里插入图片描述

这段代码中用的UI是ElementUI,对jsx写法不熟悉的同学可以看一下文档学习学习,鼠鼠这就下班

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值