vuex实现从服务端动态加载路由

一、前言

通常情况下,前端配置主要放在router.js文件中,如果新加一个菜单的话,就直接在文件中新增一个路由。当然按照后端可维护性得到做法,可以把菜单作为配置,配置起来,不用每次都修改文件内容。

二、通常在文件中配置的做法

import Vue from 'vue'
import VueRouter from 'vue-router'
import Login from '../views/Login.vue'
import HomeDemo from '../views/HomeDemo.vue'
import Test1 from "@/views/Test1";
import Test2 from "@/views/Test2";
Vue.use(VueRouter)
 
const routes = [
  {
    path: '/',
    name: 'login',
    component: Login,
    hidden:true
  },
  {
    path: '/home',
    name: 'HomeDemo',
    component: HomeDemo,
    hidden:true
  },
  {
    path: '/home',
    name: '一级菜单',
    component: HomeDemo,
    children:[
      {
        path: '/test1',
        name: '二级菜单一',
        component: Test1
      },
      {
        path: '/test2',
        name: '二级菜单二',
        component: Test2
      }
    ]
  }
]
 
const router = new VueRouter({
  routes
})
 
export default router
三、使用vuex状态管理模式实现

        1.首先在创建vuex的配置文件,定义要存放的数据 即从服务端加载过来的路由表

文件名通常是store.js

        

import Vue from 'vue';
import Vuex from 'vuex';
 
Vue.use(Vuex);
 
export default new Vuex.store({
    state:{
        routers:[]
    },
    mutations:{
        initRouters(state,data){
            state.routers = data;
        }
    },
    action:{
 
    }
})
四,处理服务端或者说格式化后端返回的路由表

服务端返回的数据格式

[{
    "id": 2,
    "url": "/",
    "path": "/home",
    "component": "Home",
    "name": "前台系统管理",
    "iconCls": "fa fa-user-circle-o",
    "parentId": 1,
    "enabled": true,
    "children": [{
            "id": 7,
            "url": null,
            "path": "/home/banner",
            "component": "Banner",
            "name": "首页广告",
            "iconCls": null,
            "parentId": 2,
            "children": null
 
        },
        {
            "id": 8,
            "url": null,
            "path": "/home/activity",
            "component": "Activity",
            "name": "首页活动",
            "iconCls": null,
            "parentId": 2,
            "children": null
 
        }
    ]
 
}]
可以和代码一的router.js做对比,component字段返回的字符串而非Vue中引入的组件对象,所以传过来的数据不能直接用,要格式化成我们需要的样子。

五、格式化服务端返回的路由表信息

import {getRequest} from "@/utils/config";
 
export const initMenus=(router,store)=>{ //初始化菜单时 传入路由配置和vuex的配置
    if (store.state.routers.length>0){ //如果store中已经存在路由表则直接返回
        return
    }
 
    getRequest('/system/config/menus').then(data=>{
        if (data){ 
            let fmtRouters = formatRouters(data); //创建格式化数据的函数
            router.addRoutes(fmtRouters); //写入路由表
            store.commit('initRouters','fmtRouters');//写入vuex
        }
 
    })
}
 
export const formatRouters=(routers)=>{
    let fmtRouters = [];
    routers.forEach(router=>{ //预设服务端返回的数据对象
        let{
            path,
            component,
            name,
            iconCls,
            children
        } = router;
 
        if (children&& children instanceof Array){ //判断是否有子菜单,如果有定会调用格式化数据
            formatRouters(children);
        }
 
        let fmtRouter = { //格式化之后的数据赋值
            path :path,
            name : name,
            iconCls : iconCls,
            children : children,
            component(resolve){
                require(['../views/' + component +'.vue'],resolve);
            }
        }
        fmtRouters.push(fmtRouter);
        return fmtRouters;
    })
}
六,页面中调用的方式 和之前在router.js中获取的方式就一样了
————————————————
版权声明:本文为CSDN博主「Java小许」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36715887/article/details/119582128

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值