vue 实现动态路由的方法


Posted in Javascript onJuly 06, 2020

很多时候我们在项目的路由都是在前端配置好的
但是有的时候为了进行全面的权限控制,会需要后台给出路由表,前端再渲染。不用在前端配置。

下面主要讲一下思路

1、和后台小哥哥沟通好数据,把我们前端配置的路由表数据给他,他就能看懂了

2、拿到数据需要我们自己再处理

路由中的component后台是给不了的,这里我们只需要后台小哥哥按照我们提供的前端component路径给数据,我们循环加载就可以了

//view就是后台给的数据
return () => import(`@/view/modules/${view}`);

这样我们就拿到了最重要的数据,即component。

3、把后台提供的数据处理成我们需要的路由表
4、添加到路由中

Router.addRoutes(路由数据)

以下讲一下我在项目中实现过程

1、新建一个router.js

里面做些基本的路由操作,比如导入包,因为我们拿到数据之后还是要自己手动去放到路由中去的
也会写一写不需要后台提供的菜单数据,比如我们测试页面或者login等等

import Vue from "vue";
import Router from "vue-router";
import AppMain from "@/view/modules/main/index";
Vue.use(Router);
export const _CONSTANTS_ROUTERS =
[
  {
    path: "/login",
    component: () => import("@/view/modules/login/index"),
    hidden: true
  },
  {
    path: "",
    component: AppMain,
    redirect: "/dashboard",
    children: [
      {
        path: "/dashboard",
        component: () => import("@/view/modules/dashboard/index"),
        name: "Dashboard",
        meta: { title: "首页", icon: "dashboard", noCache: true }
      }
    ]
  }
];
export default new Router({
  mode: "history",
  // 解决vue框架页面跳转有白色不可追踪色块的bug
  scrollBehavior: () => ({ x: 0, y: 0 }),
  // scrollBehavior: () => ({ y: 0 }),
  routes: _CONSTANTS_ROUTERS
});

基本路由表已经建立好了

2、我们在什么时候进行获取完整的路由表数据

这个时候我们就要想到路由钩子函数,当然是Router.beforeEach中做

Router.beforeEach((to, from, next) =>
{
  NProgress.start();
  if (!Token.isEmpty())
  {
    if (to.path === "/login")
    {
      next({ path: "/" });
      NProgress.done();
    }
    else if (to.path === "/404")
    {
      next();
      NProgress.done();
    }
    else
    {
      // 判断当前用户是否已拉取完角色信息
      if (Store.getters.roles.length === 0)
      {
         //拉取路由数据
ACLRepo.listMenuTreeOfCurrentUser().then(response =>
          {
            Store.dispatch("generateRoutes", response).then(() =>
            {
              // 根据roles权限生成可访问的路由表
              Router.addRoutes(Store.getters.addRouters); // 动态添加可访问路由表
              next({ ...to, replace: true }); // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
            });
          });
      }
      else
      {
         next();
      }
    }
  }
  else
  {
    next();
  }
});

3、路由数据重新封装

generateRoutes

import { _CONSTANTS_ROUTERS } from "@/scripts/router";
import AppMain from "@/view/modules/main/index";
const _PERMISSION = {
  state: {
    routers: _CONSTANTS_ROUTERS,
    addRouters: []
  },
  mutations: {
    setRouters: (state, routers) =>
    {
      state.addRouters = routers;
      //和已经存在的路由表拼接
      state.routers = _CONSTANTS_ROUTERS.concat(routers);
    }
  },
  actions: {
    generateRoutes({ commit }, response)
    {
      let asyncRouters = filterAsyncRouter(response);
      asyncRouters.push({ path: "*", redirect: "/404", hidden: true });
      commit("setRouters", asyncRouters);
    }
  }
};
 
function filterAsyncRouter(routers)
{
  // 遍历后台传来的路由字符串,转换为组件对象
  let accessedRouters = routers.filter(router =>
  {
    if (router.meta)
    {
      // 默认图标处理
      router.meta.icon = router.meta.icon ? router.meta.icon : "component";
    }
    if (router.component === "main")
    {
      // Main组件特殊处理
      router.component = AppMain;
    }
    else
    {
      //处理组件---重点
      router.component = loadView(router.component);
    }
    //存在子集
    if (router.children && router.children.length)
    {
      router.children = filterAsyncRouter(router.children);
    }
    return true;
  });
  return accessedRouters;
}
function loadView(view)
{
  // 路由懒加载
  return () => import(`@/view/modules/${view}`);
}
export default _PERMISSION;

到这里其实就完成了,理清楚思路,其实很简单

以上就是vue 实现动态路由的方法的详细内容,更多关于vue 实现动态路由的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
把JS与CSS写在同一个文件里的书写方法
Jun 02 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
Oct 13 Javascript
Json实现异步请求提交评论无需跳转其他页面
Oct 11 Javascript
js中跨域方法原理详解
Jul 19 Javascript
js获取Html元素的实际宽度高度的方法
May 19 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
Sep 18 Javascript
vue获取input输入值的问题解决办法
Oct 17 Javascript
javascript按钮禁用和启用的效果实例代码
Oct 29 Javascript
原生js+cookie实现购物车功能的方法分析
Dec 21 Javascript
node的process以及child_process模块学习笔记
Mar 06 Javascript
Java Varargs 可变参数用法详解
Jan 28 Javascript
React forwardRef的使用方法及注意点
Jun 13 Javascript
Nuxt配置Element-UI按需引入的操作方法
Jul 06 #Javascript
解决Nuxt使用axios跨域问题
Jul 06 #Javascript
js实现星星打分效果
Jul 05 #Javascript
jQuery实现简单飞机大战
Jul 05 #jQuery
javascript实现贪吃蛇小练习
Jul 05 #Javascript
jQuery实现简单日历效果
Jul 05 #jQuery
jQuery实现飞机大战小游戏
Jul 05 #jQuery
You might like
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
js打印纸函数代码(递归)
2010/06/18 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
JS数组的遍历方式for循环与for...in
2014/07/31 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
vue中使用heatmapjs的示例代码(结合百度地图)
2018/09/05 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
Vue如何实现变量表达式选择器
2021/02/18 Vue.js
[48:28]完美世界DOTA2联赛循环赛FTD vs Magma第二场 10月30日
2020/10/31 DOTA
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
python和shell变量互相传递的几种方法
2013/11/20 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
PyTorch中 tensor.detach() 和 tensor.data 的区别详解
2020/01/06 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
pandas数据拼接的实现示例
2020/04/16 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
Charlotte Tilbury澳大利亚官网:英国美妆品牌
2018/10/05 全球购物
《商鞅南门立木》教学反思
2014/02/16 职场文书
餐饮业员工工作决心书
2014/03/11 职场文书
升旗仪式主持词
2014/03/19 职场文书
国庆节演讲稿
2014/05/27 职场文书
基层党员对照检查材料
2014/08/25 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书