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 相关文章推荐
jQuery.each()用法分享
Jul 31 Javascript
js读写cookie实现一个底部广告浮层效果的两种方法
Dec 29 Javascript
详解AngularJS中的作用域
Jun 17 Javascript
jQuery基于扩展实现的倒计时效果
May 14 Javascript
JS字符串false转boolean的方法(推荐)
Mar 08 Javascript
bootstrap栅格系统示例代码分享
May 22 Javascript
JS实现显示当前日期的实例代码
Jul 03 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
Oct 31 Javascript
详解JSON和JSONP劫持以及解决方法
Mar 08 Javascript
微信小程序中为什么使用var that=this
Aug 27 Javascript
一篇文章学会Vue中间件管道
Jun 20 Vue.js
TypeScript 内置高级类型编程示例
Sep 23 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程序防止ddos,dns,集群服务器攻击的解决办法
2013/06/18 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
PHP的Yii框架中View视图的使用进阶
2016/03/29 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
laravel批量生成假数据的方法
2019/10/09 PHP
Javascript string 扩展库代码
2010/04/09 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
2012/11/14 Javascript
window.open打开页面居中显示的示例代码
2013/12/27 Javascript
javascript的解析执行顺序在各个浏览器中的不同
2014/03/17 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
利用Javascript开发一个二维周视图日历
2017/12/14 Javascript
vue-cli创建的项目,配置多页面的实现方法
2018/03/15 Javascript
jQuery实现鼠标移入移出事件切换功能示例
2018/09/06 jQuery
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
微信小程序swiper实现文字纵向轮播提示效果
2020/01/21 Javascript
python实现windows壁纸定期更换功能
2019/01/21 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
简单了解django缓存方式及配置
2019/07/19 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
python实现程序重启和系统重启方式
2020/04/16 Python
python进行二次方程式计算的实例讲解
2020/12/06 Python
幼儿园园长自我鉴定
2013/10/22 职场文书
《白鹅》教学反思
2014/04/13 职场文书
群众路线领导干部个人对照检查材料(集锦)
2014/09/23 职场文书
初三毕业评语
2014/12/26 职场文书
学校中秋节活动总结
2015/03/23 职场文书
中标通知书
2015/04/17 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
通讯稿格式及范文
2015/07/22 职场文书
2015年美容师个人工作总结
2015/10/14 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
电子表的操作介绍说明书
2019/10/28 职场文书
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript