首页 > 其他分享 >Vue 实现动态渲染 Element组件 Menu

Vue 实现动态渲染 Element组件 Menu

时间:2023-08-19 15:31:47浏览次数:44  
标签:el Vue menuName menuId Menu Element parentId menuIcon icon

前言

在学习 Vue 时,我们都会写关于管理系统的项目,在管理项目中,我们必然会处理菜单模块,通常我们会使用 Element 这个UI框架,但官方案例是静态数据,而在实际项目需求中,我们经常会实现多级菜单的动态渲染,今天我们实现这一需求,实现 Vue 动态菜单的渲染。

正文部分

一、动态数据格式

动态菜单的数据格式,我们一般会使用树形结构,如下代码所示:

[
    {
      menuName: "首页",
      menuId: 1,
      parentId: 0,
      menuIcon: "el-icon-s-home",
      url: "/index",
    },
    {
      menuName: "个人信息",
      menuId: 2,
      parentId: 0,
      menuIcon: "el-icon-user-solid",
      url: "/userInfo",
    },
    {
      menuName: "系统设置",
      menuId: 3,
      parentId: 0,
      menuIcon: "el-icon-video-camera-solid",
      url: "/system/userList",
      childNode: [
        {
          menuName: "用户列表",
          menuId: 300,
          parentId: 3,
          menuIcon: "el-icon-video-camera-solid",
          url: "/system/userList",
        },
        {
          menuName: "角色权限",
          menuId: 301,
          parentId: 3,
          menuIcon: "el-icon-video-camera-solid",
          url: "/system/role",
        }
      ],
    },
 ]

二、Vue 代码实现

1、template 模块代码

<template>
  <el-menu
    mode="vertical"
    :default-active="defaultActive"
    unique-opened
    router
  >
    <el-menu-item
      :index="child.url"
      v-for="child in noChildNodeList"
      :key="child.menuId"
    >
      <i :class="child.menuIcon"></i>
      <span slot="title">{{ child.menuName }}</span>
    </el-menu-item>
    <el-submenu
      v-for="child in hasChildNodeList"
      :key="child.id"
      :index="child.url"
    >
      <template slot="title">
        <i :class="child.menuIcon"></i>
        <span>{{ child.menuName }}</span>
      </template>
      <el-menu-item
        v-for="childnode in child.childNode"
        :key="childnode.menuId"
        :index="childnode.url"
      >
        <i :class="childnode.menuIcon"></i>
        <span slot="title">{{ childnode.menuName }}</span>
      </el-menu-item>
    </el-submenu>
  </el-menu>
</template>

2、script 模块代码

<script>
export default {
  data() {
    return {
      navbarList: [],
      menuList: [
        {
          menuName: "首页",
          menuId: 1,
          parentId: 0,
          menuIcon: "el-icon-s-home",
          url: "/index",
        },
        {
          menuName: "个人信息",
          menuId: 2,
          parentId: 0,
          menuIcon: "el-icon-user-solid",
          url: "/userInfo",
        },
        {
          menuName: "系统设置",
          menuId: 3,
          parentId: 0,
          menuIcon: "el-icon-video-camera-solid",
          url: "/system/userList",
          childNode: [
            {
              menuName: "用户列表",
              menuId: 300,
              parentId: 3,
              menuIcon: "el-icon-video-camera-solid",
              url: "/system/userList",
            },
            {
              menuName: "角色权限",
              menuId: 301,
              parentId: 3,
              menuIcon: "el-icon-video-camera-solid",
              url: "/system/role",
            }
          ],
        },
      ],
    };
  },
  computed: {
    noChildNodeList() {
      return this.menuList.filter((item) => {
        return !item.childNode;
      });
    },
    hasChildNodeList() {
      return this.menuList.filter((item) => {
        return item.childNode;
      });
    },
  },
};
</script>

3、style 模块代码

    <style lang="scss" scoped>
    .el-menu {
      background-color: #b8d8f1;
      color: #007bff;
    }
    .el-menu-item.is-active {
      color: #ecf5ff;
      background-color: #007bff;
    }
    ​
    .el-menu-item {
      color: #007bff;
      border-bottom: 2px solid #eee;
      i {
        color: inherit;
      }
    }
    ::v-deep .el-submenu__title {
      color: #007bff;
    }
    ::v-deep .el-submenu__title i {
      color: #007bff;
    }
    <style>

三、菜单效果图

image-20230208094320657.png

总结

实现以上需求,有很多种方案方式,如果有更好的方法,欢迎交流沟通。

标签:el,Vue,menuName,menuId,Menu,Element,parentId,menuIcon,icon
From: https://blog.51cto.com/u_16203259/7150258

相关文章

  • vue3探索——组件通信之事件总线
    Vue2.x使用EventBus进行组件通信,而Vue3.x推荐使用mitt.js。比起Vue实例上的EventBus,mitt.js好在哪里呢?首先它足够小,仅有200bytes,其次支持全部事件的监听和批量移除,它还不依赖Vue实例,所以可以跨框架使用,React或者Vue,甚至jQuery项目都能使用同一套库。安装使用yarn安装yarn......
  • Vue项目中如何生成ORC用户分享图片效果
    在Vue中生成二维码用户分享图片效果可以使用以下步骤:安装qrcode库在项目中使用npm或yarn安装qrcode库:npminstallqrcode--save导入qrcode库在组件中导入qrcode库:importQRCodefrom'qrcode';创建二维码使用qrcode库的toDataURL方法创建二维码:constcanvas=document.createElem......
  • vue数据传递【父子组件】-父子props,子父$emit
    一、父子组件传递1、父组件数据传递给子组件【props】父组件的数据变化时,子组件会自动更新在父组件中引用子组件<子组件name/>import子组件from./子组件位置/子组件所在vue.vue在组件中注册子组件components:{子组件名称}子组件可以通过props选项声明接收该prop......
  • SyntaxError: /xxxx.vue: Unexpected token, expected “,“,[object Promise]export {
    本地老工程vue2.7.x+webpack4在升级webpack5的时候遇启动和打包报错:SyntaxError:SyntaxError:/xxxxx.vueUnexpectedtoken,expected","(1:8)>1|[objectPromise]|^2|export{render,staticRenderFns}最后才发现是prettier导致的。推荐看......
  • vue3 vite后台管理模板项目打包报错 Some chunks are larger than 500 KiB after mini
    ​ 1、错误原因分析:超过块大小限制,块大小默认500KB2、解决办法:在vite.config.js中增加output配置项build:{chunkSizeWarningLimit:1500,//调整包的大小rollupOptions:{output:{//最小化拆分包manualChunks(id){......
  • Vue中使用Element
    Vue中使用Element.UI菜单完成主体页面搭建一.搭建ElementUI基础环境(基于脚手架)1.新建空的文件夹,文件夹命名自定义2.在文件资源管理器上方输入cmd3.然后在控制台中输入vuecreate(自定义名称)注意:只支持小写输入完后按Enter4.在第一个选择项中选择Manuallyselectfeatures5.第......
  • vue3常见的难点
    vue中params和query的区别,以及具体用法:https://blog.csdn.net/weixin_42282727/article/details/107505014route、router区别:https://blog.csdn.net/m0_67948827/article/details/127051410......
  • 关于 Element-UI 的完整分页
    1.首先要在Elment-ui的官网下载安装包2.然后项目中的manin.js中配置组件,使其可以正常使用3.正确写入配置。4.然后去复制官网他所给的分页代码,修改参数   <el-pagination     @size-change="handleSizeChange"    @current-change="handleCurr......
  • vue3新语法糖——setup script
    vue3新语法糖——setupscriptCoCoyY12021-03-2712:5241480 前言vue3上线已经很久了,许多小伙伴应该都已经使用过vue3了。那么在使用vue3compositionAPI的时候有没有觉得整个过程会比较繁琐呢。比如当你定义了一个方法,然后发现模板需要使用该方法,然后就必须将方法返回......
  • WPF加载GIF的五种方式(Storyboard / WpfAnimatedGif / ImageAnimator / PictureBox / M
    部分内容参考博文WPF如何显示gif一、使用Storyboard效果:  (1)页面xaml:<Windowx:Class="PlayGifDemo.StoryboardWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2......