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 相关文章推荐
Ext JS添加子组件的误区探讨
Jun 28 Javascript
多种方法判断Javascript对象是否存在
Sep 22 Javascript
jQuery实现的导航条切换可显示隐藏
Oct 22 Javascript
如何在MVC应用程序中使用Jquery
Nov 17 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
Sep 06 Javascript
Angular.js基础学习之初始化
Mar 10 Javascript
微信小程序多张图片上传功能
Jun 07 Javascript
Node.js 回调函数实例详解
Jul 06 Javascript
javascript算法之二叉搜索树的示例代码
Sep 12 Javascript
一种angular的方法级的缓存注解(装饰器)
Mar 13 Javascript
Vue插件之滑动验证码
Sep 21 Javascript
Element MessageBox弹框的具体使用
Jul 27 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
用Flash图形化数据(一)
2006/10/09 PHP
PHP 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
php面向对象全攻略 (六)__set() __get() __isset() __unset()的用法
2009/09/30 PHP
php在服务器执行exec命令失败的解决方法
2012/03/03 PHP
克隆一个新项目的快捷方式
2013/04/10 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
PHP5各个版本的新功能和新特性总结
2014/03/16 PHP
PHP常用编译参数中文说明
2014/09/27 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
2016/06/12 PHP
jQuery获取URL请求参数的方法
2015/07/18 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
form表单序列化详解(推荐)
2017/08/15 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
2017/11/20 Javascript
JavaScript继承与多继承实例分析
2018/05/26 Javascript
vue在index.html中引入静态文件不生效问题及解决方法
2019/04/29 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
Django的信号机制详解
2017/05/05 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
Mac中PyCharm配置Anaconda环境的方法
2020/03/04 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
QML实现钟表效果
2020/06/02 Python
python如何导出微信公众号文章方法详解
2020/08/31 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
关于HTML5语义标签的实践(blog页面)
2016/07/12 HTML / CSS
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
少先队入队活动方案
2014/02/08 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
母亲去世追悼词
2015/06/23 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
四年级数学教学反思
2016/02/16 职场文书
60句有关成长的名言
2019/09/04 职场文书
Python OpenCV超详细讲解基本功能
2022/04/02 Python