vue配置文件自动生成路由和菜单实例代码

因为不同的用户有不同的权限,能访问的页面是不一样的,所以我们在写后台管理系统时就会遇过这样的需求:根据后台数据动态添加路由和菜单,这篇文章主要给大家介绍了关于vue配置文件自动生成路由和菜单的相关资料,需要的朋友可以参考下

vue配置文件自动生成路由和菜单实例代码,久久派带你了解更多相关信息。

目录
  • 写在前面
  • router.json
  • 路由生成
  • 菜单生成
  • 效果
  • 总结

写在前面

每次重复写路由的时候是不是会觉得很烦,特别是项目大的时候,路由会有特别多,看都看不过来,所以这里我是有了一个router.json的配置文件来对路由做一些简单的配置,然后让路由和左侧菜单栏可以同时生成。

vue配置文件自动生成路由和菜单实例代码

router.json

主要配置项如下:

vue配置文件自动生成路由和菜单实例代码

{  \"name\": \"routerConfig\",  \"menu\": [{    \"id\": \"1\", //路由id,不能重复    \"name\": \"home\",//路由名字    \"path\": \"/homePage\",//路由路径    \"label\": \"首页\",//菜单标题    \"selected\": true,//默认选中    \"icon\": \"el-icon-monitor\",//菜单显示图标    \"open\": true,//默认打开    \"component\": \"homePage/homePage.vue\",//组件路由    \"children\": [ //子菜单      {        \"id\": \"3\",        \"name\": \"getCover\",        \"path\": \"/getCover\",        \"label\": \"封面截取\",        \"selected\": false,        \"icon\": \"el-icon-scissors\",        \"open\": false,        \"component\": \"getCover/getCover.vue\",        \"children\": []      }    ]  },{    \"id\": \"2\",    \"name\": \"testPage\",    \"path\": \"/testPage\",    \"label\": \"测试\",    \"selected\": false,    \"icon\": \"el-icon-setting\",    \"open\": false,    \"component\": \"test/test.vue\",    \"children\": []  },{    \"id\": \"5\",    \"name\": \"testMenu\",    \"path\": \"/testMenu\",    \"label\": \"菜单测试\",    \"selected\": false,    \"icon\": \"el-icon-setting\",    \"open\": false,    \"component\": \"testMenu/testMenu.vue\",    \"children\": []  }]}

配置主要分为两部分,一部分由于菜单生成,一部分用于路由生成,当然两者也有共用的部分

路由生成

import Vue from \'vue\'import VueRouter from \'vue-router\'import ro from \"element-ui/src/locale/lang/ro\";Vue.use(VueRouter)//引入配置文件router.jsonlet routerMenu = require(\'@/config/router.json\');routerMenu = routerMenu.menu;let menu = [];//配置路由let formatRoute = function (routerMenu,menu){  for(let i = 0; i < routerMenu.length; i++){    let temp = {      path: routerMenu[i].path,      name: routerMenu[i].name,      //这块要注意      //用require这种方式引入的时候,会将你的component分别打包成不同      //的js,加载的时候也是按需加载,只用访问这个路由网址时才会加载      //这个js      component: resolve => require([`@/views/${routerMenu[i].component}`], resolve)    };    menu.push(temp);    if(routerMenu[i].children && routerMenu[i].children.length > 0){    //递归生成子菜单的路由      formatRoute(routerMenu[i].children,menu);    }  }}//初始化formatRoute(routerMenu,menu);//重定向设置const routes = [  {    path: \'/\',    redirect: \'/homePage\'  },]//将生成的路由文件push进去for(let i = 0; i < menu.length; i++)  routes.push(menu[i]);  const router = new VueRouter({  routes})export default router

菜单生成

<template>  <p id=\"leftMenu\">  </p></template><script>export default {  name: \"left\",  data(){    return{      menu:[]    }  },  methods:{  //通过路由id来找节点    findNodeById(node,id){      for(let i = 0; i < node.length; i++){        if(id == node[i].id){          node[i].selected = true;          if(node[i].children && node[i].children.length > 0){            this.findNodeById(node[i].children,id);          }          node[i].open = !node[i].open;          if(this.$route.path !== node[i].path) this.$router.push(node[i].path);        }else{          node[i].selected = false;          if(node[i].children && node[i].children.length > 0){            this.findNodeById(node[i].children,id);          }else{          }        }      }    },    //选中菜单节点    chooseNode(id){      this.findNodeById(this.menu,id);      let domTree = this.generatorMenu(this.menu,\'\',0)      let leftMenu = document.getElementById(\'leftMenu\');      leftMenu.innerHTML = domTree;    },    //动态生成菜单目录    generatorMenu(menu,temp,floor){      for(let i = 0; i < menu.length; i++){        temp += `<p style=\"width: max-content\">                    <p class=\"menuOption\" οnclick=\"chooseNode(${menu[i].id})\"                            style=\"text-indent: ${floor}em;                            background-color: ${menu[i].selected?\'aquamarine\':\'\'};                            cursor: pointer;                            margin-top: 0.3rem;>                        <i class=\"${menu[i].icon}\"></i>                        ${menu[i].label}`        if(!menu[i].open && menu[i].children && menu[i].children.length > 0){          temp += `<i style=\"margin-left: 1rem\" class=\"el-icon-arrow-down\"></i>`        }else{          if(menu[i].open && menu[i].children && menu[i].children.length > 0){            temp += `<i style=\"margin-left: 1rem\" class=\"el-icon-arrow-up\"></i>`          }        }        temp += `</p>`        if(menu[i].open && menu[i].children && menu[i].children.length != 0){          temp = this.generatorMenu(menu[i].children,temp,floor+1);        }        temp += `</p>`      }      return temp;    }  },  created() {  },  mounted() {    window.chooseNode = this.chooseNode;    let menu = [];    //获取路由菜单配置文件    const router = require(\'@/config/router.json\');    menu = router.menu;    this.menu = menu;    let domTree = this.generatorMenu(menu,\'\',0)    let leftMenu = document.getElementById(\'leftMenu\');    leftMenu.innerHTML = domTree;  }}</script><style scoped>  #leftMenu{    min-height: calc(100vh - 44px - 1rem);    background-color: cornflowerblue;    text-align: left;    padding: 0.5rem 1rem;    font-size: large;    font-weight: bold;  }  .selectedM{    background-color: aquamarine;  }  .menuOption{    cursor: pointer;  }</style>

效果

vue配置文件自动生成路由和菜单实例代码

左侧菜单便是自动生成的,点击菜单栏也会跳转到对应的路由地址,当然,样式有点丑,但样式的话可以自己后续再调整。

这样的话,我们新加菜单的时候只需要在配置文件中配置好,就可以直接写编写页面,这样也给我们省下了很多时间。

总结

到此这篇关于vue配置文件自动生成路由和菜单的文章就介绍到这了,更多相关vue自动生成路由和菜单内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/13259.html

(0)
上一篇 2021-08-16 17:58:56
下一篇 2021-08-16 17:58:59

相关推荐

发表回复

登录后才能评论