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 各种浏览器下获得日期区别
Dec 22 Javascript
JavaScript 动态生成方法的例子
Jul 22 Javascript
实现局部遮罩与关闭原理及代码
Feb 04 Javascript
jquery实现盒子下拉效果示例代码
Sep 12 Javascript
只需一行代码,轻松实现一个在线编辑器
Nov 12 Javascript
javascript实现页面内关键词高亮显示代码
Apr 03 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
Mar 31 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
Jul 15 Javascript
Extjs表单输入框异步校验的插件实现方法
Mar 20 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
layer.open组件获取弹出层页面变量、函数的实例
Sep 25 Javascript
浅谈js中的attributes和Attribute的用法与区别
Jul 16 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在Web开发领域的优势
2006/10/09 PHP
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
如何使用脚本模仿登陆过程
2006/11/22 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
屏蔽IE弹出"您查看的网页正在试图关闭窗口,是否关闭此窗口"的方法
2013/12/31 Javascript
javascript实现的元素拖动函数宿主为浏览器
2014/07/21 Javascript
JS显示表格内指定行html代码的方法
2015/03/31 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
jQuery插件HighCharts绘制2D半圆环图效果示例【附demo源码下载】
2017/03/09 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
jQuery Ajax async=>false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
react实现antd线上主题动态切换功能
2019/08/12 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
python PyTorch预训练示例
2018/02/11 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
python如何判断IP地址合法性
2020/04/05 Python
python交互模式基础知识点学习
2020/06/18 Python
CSS3效果:自定义“W”形运行轨迹实例
2017/03/29 HTML / CSS
英国最大的百货公司:Harrods
2016/08/18 全球购物
中专毕业生自我鉴定范文
2013/11/09 职场文书
单位消防安全制度
2014/01/12 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
课外活动总结
2015/02/04 职场文书
庆祝教师节活动总结
2015/03/23 职场文书
德能勤绩工作总结
2015/08/11 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书
Redis数据同步之redis shake的实现方法
2022/04/21 Redis