• elmentUI多级菜单动态显示


    背景:根据后端返回数据生成多级菜单,菜单项可能会有很深的层级,如果直接使用elementUI 去编写会写很深的层级,代码繁杂,一旦后面菜单项有改动又不利于维护

    如何做到多级菜单?使用递归组件

    elmentUI原本写法:

    1. <el-menu
    2. default-active="2"
    3. class="el-menu-vertical-demo"
    4. @open="handleOpen"
    5. @close="handleClose"
    6. background-color="#545c64"
    7. text-color="#fff"
    8. active-text-color="#ffd04b">
    9. <el-submenu index="1">
    10. <template slot="title">
    11. <i class="el-icon-location">i>
    12. <span>导航一span>
    13. template>
    14. <el-submenu index="1-4">
    15. <template slot="title">选项4template>
    16. <el-menu-item index="1-4-1">选项1el-menu-item>
    17. el-submenu>
    18. el-submenu>
    19. <el-menu-item index="4">
    20. <i class="el-icon-setting">i>
    21. <span slot="title">导航四span>
    22. el-menu-item>
    23. el-menu>

    使用递归组件写法:

    主要思路:

    • 通过数据查找hasOneChild()判断是否有children,有证明有子菜单,有子菜单使用el-submenu封装的组件
    • SidebarItem.vue组件内部调用自己的组件;
    • 渲染元素组件Item.vue使用函数式组件写法;
    1. <template v-if="hasOneChild(item.children, item) && (!oneChild.children || oneChild.noShowChild)">
    2. <app-link v-if="item.redirect != 'noRedirect' && item.meta" :to="resolvePath(item.path)">
    3. <el-menu-item :index="resolvePath(item.path)" class="submenu-title-noDropdown">
    4. <Item v-if="item.meta" :icon="item.meta.icon" :title="item.meta.title">Item>
    5. el-menu-item>
    6. app-link>
    7. template>
    8. <el-submenu v-else :index="resolvePath(item.path)">
    9. <template slot="title" v-if="item.meta">
    10. <Item :icon="item.meta.icon" :title="item.meta.title">Item>
    11. template>
    12. <sidebar-item
    13. v-for="child in item.children"
    14. :key="child.path"
    15. :item="child"
    16. :base-path="resolvePath(child.path)"
    17. class="nest-menu"
    18. >sidebar-item>
    19. el-submenu>
    1. // 判断当前菜单是否有子菜单
    2. hasOneChild(children = [], item) {
    3. // 判断如果菜单是隐藏直接不显示
    4. // if(item.hidden) return false;
    5. if (children.length === 0) return false;
    6. const showChildArr = children.filter(child => {
    7. console.log(child);
    8. if (child.hidden) return false;
    9. else return true;
    10. });
    11. // 没有找到child说明没有子菜单
    12. if (showChildArr.length === 0) {
    13. this.oneChild = { ...item, path: item.path, noShowChild: true };
    14. return true;
    15. }
    16. console.log(this.oneChild, "this.oneChild");
    17. return false;
    18. },

    函数式组件Item.vue写法:

    1. functional:true定义组件为函数式组件;
    2. props接收父级传入属性;
    3. render函数生成虚拟节点;

  • 相关阅读:
    安信可开发环境构建-基于Ai-WB2系列 和 Ai-M61 或 Ai-M62 (环境上下文切换)
    Netty5-Netty模型
    禁止EditView自动弹出系统软键盘_Android基础篇(Java)
    坐标下降算法最小化二次函数,复现等值线图
    Qt常用快捷键
    “批量随机字母命名文件,轻松管理你的文件库“
    一文带你了解MySQL之optimizer trace神器的功效
    LeetCode 387 字符串中的第一个唯一字符 简单
    “Redis与Spring整合及缓存优化“
    计算机毕业设计ssm+vue基本微信小程序的蛋糕预订平台系统
  • 原文地址:https://blog.csdn.net/qq_34569497/article/details/134266821