首页 > 其他分享 >vue接口获取路由菜单

vue接口获取路由菜单

时间:2022-08-25 15:22:35浏览次数:53  
标签:vue name item 菜单 let path router children 路由

menuFormat.js(格式化路由表)
export const initMenu = (data) => {
    let list = [];
    data.forEach(router => {
        let {
            path,
            component,
            name,
            meta,
            // icon,
            children
        } = router;
        if (children && children instanceof Array) {
            children = initMenu(children);
        }
        let item = {
            path: path,
            component: resolve => {
                if (component == 'layout') {
                    require(['../view/layout/layout.vue'], resolve)
                } else {
                    require(['../view/test/' + component + '.vue'], resolve)
                }
            },
            name: name,
            // icon: icon,
            meta: meta,
            children: children
        };
        list.push(item);
    })
    return list;
}

登录

<script>
import {  initMenu } from "@/utils/menuFormat.js";
import { mapState } from "vuex";
export default {
    data () {
    },

    components: {},

    computed: {
        ...mapState(['menus'])
    },
    methods: {
        
        getMenu(){
            api_GetUserPermissionById({})
                .then((res) => {
                    console.log(res)
                    // 清除404路由(避免出现刷新页面404闪现)
                    this.$router.options.routes.splice(this.$router.options.routes.findIndex(item => item.name === 'NOTFOUND'), 1)
                    this.$router.addRoutes(this.$router.options.routes);
                    let {menulist} = res.result
          
                    let routerFormat = []
                    // 格式化路由(将接口数据过滤成路由表需要的格式)
                    menulist.forEach(item=>{
                        routerFormat.push({
                          path: item.menuurl,
                          name: item.menuurl.replace('/',''),
                          component: item.menuurl.replace('/',''),
                          meta: {
                              title: item.menuname,
                              icon: item.menuimg
                          }
                        })
                    })
                    let sideMenu = initMenu(routerFormat)
                    let routerList = this.$router.options.routes
                    routerList.forEach(item => {
                        if(item.name == 'layout'){
                            item.children = item.children.concat(sideMenu)
                        }
                    });
                    let notfound = {
                        path: '*',
                        name: 'NOTFOUND',
                        component: resolve => require(['@/view/layout/notFound.vue'], resolve),
                        hidden: true
                    }
                    routerList.push(notfound)
                    this.$router.addRoutes(routerList);
                    this.$store.commit("ADD_ROUTES", sideMenu);
                    let path  = menulist[0].menuurl
                    this.$store.commit("ACTIVE_MENU",path);
                    console.log(path,this.$router.options.routes)
                    this.$router.push({
                        path: path
                    })
                    

                })
                .catch((error) => {
                    console.log(error);
                });
        },

        
    }
}
</script>

store.js

//路由列表
        ADD_ROUTES: (state, data) => {
            state.menus = data;
            console.log(data)
            localStorage.setItem('menus', JSON.stringify(data));
        },

 

标签:vue,name,item,菜单,let,path,router,children,路由
From: https://www.cnblogs.com/xhrr/p/16624385.html

相关文章

  • Vue项目使用高德地图
    流程:注册账号获取KEY安装使用注册链接:https://lbs.amap.com/选择Web端(JSAPI),同时需要域名限制请按提示进行输入:创建完成后即可看到KEY。安装高德地图JSAPI......
  • vue2的nextTick使用
    1、关于nextTick。vue中的Dom更新是异步的,是异步的意味着当被处理数据是动态变化时,此时对应的Dom未能及时更新(同步更新)就会导致数据已经更新(model层已经更新)而视力层未更......
  • vue集成elementUI
    vue集成elementUI1.使用npm安装elementui模块:指令:npm/cnpminstallelement-ui–S2.安装按需引入的插件:指令:npminstallbabel-plugin-component-D3.设置.babe......
  • vue 安装插件 eslint检测警告
    npm安装报错npmERR!codeERESOLVEnpmERR!ERESOLVEcouldnotresolvenpmERR!npmERR!问题原因安装的包与已经存在的包有冲突解决办法npminstallxxx--fo......
  • Vue项目创建(完整步骤级版本查看)
    涉及软件版本:Nodev14.17.0;npm6.14.13;vue3.2.13;@vue/cli5.0.8一:安装node、npm1.检查Node,未安装【https://nodejs.org/en/】访问网址下载最新版安装2.检查......
  • vue中element-ui table滚动加载
    //1.在main.js里注册 Vue.directive('loadmore', { bind(el, binding) { const selectWrap = el.querySelector('.el-table__body-wrapper') selectWrap.ad......
  • vue3 vuex4 store的响应式取值
    场景:在页面中点击按钮,数量增加,值是存在store中的,点击事件,值没变。<scriptsetuplang="ts">import{useStore}from'@/vuex';conststore=useStore()constonSu......
  • vue使用rem (手机端PC端通用)
    只有PC端时main.js newVue({ router, store, render:h=>h(App),created(){//实例创建完成后被立即调用rem换算方法,解决内容闪现问题......
  • VUE 基础知识总结
    VUE的介绍VUE的导包<!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><!--开发环境版本--><scriptsrc="https://cdn.jsdel......
  • vue文件夹上传控件选哪个好?
    ​需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:......