怎么用vue实现动态路由

1、什么是动态路由

动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现及页面的渲染。动态的路由存储可分为两种,一种是将路由存储到前端。另一种则是将路由存储到数据库。动态路由的使用一般结合角色权限控制一起使用。

总结:

1)路由可变,不是写死的,动态加载

2)存储分两种:存前端,存数据库

2、动态路由的好处

使用动态路由可以跟灵活,无需手工维护,我们可以使用一个页面对路由进行维护。如果将路由存储到数据库,还可以增加安全性。

总结:

1)灵活,无需手工维护

2)增加安全性

3、动态路由如何实现

在此以路由存储在数据库为例

流程:一般我们在登录的时候,根据登录用户的角色返回此角色可以访问的页面的路由,前端将路由存储到vuex(vuex存储的数据必须可持久的,不要一刷新页面就不见),我们在路由前置守卫处动态添加拿到的路由,对页面进行渲染。

1)此为我的router目录,index.js对路由添加,守卫拦截等处理。static-route.js为前端定义的静态路由,不需要动态加载的,如登陆页面,忘记密码页面,404页面等。

怎么用vue实现动态路由

怎么用vue实现动态路由

index.js

import Vue from 'vue'import $cookies from 'vue-cookies'import VueRouter from 'vue-router'import store from '../store'import staticRoute from './static-route.js'Vue.use(VueRouter)const router = new VueRouter({	mode: 'history',	base: process.env.BASE_URL,	routes: staticRoute //staticRoute为静态路由,不需动态添加})let isToken = truerouter.beforeEach(async (to, from, next) => {	//定义isToken为true和vuex不为空时添加路由	if (isToken && store.state.routers.routers.length != 0) {		//从vuex中获取动态路由		const accessRouteses = await store.state.routers.routers;		//动态路由循环解析和添加		accessRouteses.forEach(v => {			v.children = routerChildren(v.children);			v.component = routerCom(v.component);			router.addRoute(v); //添加		})		isToken = false //将isToken赋为 false ,否则会一直循环,崩溃		next({			...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)			replace: true, // 重进一次, 不保留重复历史		})	} else {		if (to.name == null) {			next("/404")		} else {			if (to.meta.title) { //判断是否有标题				document.title = to.meta.title //给相应页面添加标题			}			next()		}	}})function routerCom(path) { //对路由的component解析	return (resolve) => require([`@/views/${path}`], resolve);}function routerChildren(children) { //对子路由的component解析	children.forEach(v => {		v.component = routerCom(v.component);		if (v.children != undefined) {			v.children = routerChildren(v.children)		}	})	return children}export default router

2)登陆成功后将获取到的动态路由存储到vuex

怎么用vue实现动态路由

vuex—>index.js

import Vue from 'vue'import Vuex from 'vuex'//数据持久化import createPersistedState from "vuex-persistedstate";Vue.use(Vuex)const routers = {  namespaced: true,  state: () => ({    routers:"",  }),  mutations: {    routers(state, newsdata) {      state.routers = newsdata    },  },  actions: {    routers(context) {      context.commit('routers')    },  },  getters: {    routers(state) {      console.log("getters", state)      return state.routers    },      }}const store = new Vuex.Store({  modules: {    routers: routers,  },    // 数据持久化  plugins: [createPersistedState({    //key是存储数据的键名    key: 'routersData',    //paths是存储state中的那些数据,如果是模块下具体的数据需要加上模块名称,如user.token      paths: ["routers.routers"]  })]})export default store

我的动态路由模板

//动态路由const dynamicRoute = [{  "path": "/main",  "name": "main",  "redirect": "/main/index",  "component": "main/main.vue",  "children": [{      "path": "index",      "name": "index",      "component": "index/index.vue",      "meta": {        "name": "index",        "title": "首页",        "icon": "el-icon-location",        "menu":true //true为菜单栏      }    },    {      "path": "Configuration",      "name": "Configuration",      "redirect": "Configuration/route",      "component": "Configuration/index.vue",      "roles": ['developer', "admin"], //  developer、admin角色的用户才能访问该页面      "meta": {        "title": "配置",        "icon": "el-icon-location",        "menu":true      },      "children": [{          "path": "route",          "name": "route",          "component": "Configuration/route/index.vue",          "meta": {            "title": "菜单",            "icon": "",            "menu":true          },        }, {          "path": "user",          "name": "user",          "component": "Configuration/user/index.vue",          "meta": {            "title": "用户管理",            "icon": "el-icon-location",            "menu":true          },        },        {          "path": "admin",          "name": "admin",          "component": "Configuration/admin/index.vue",          "meta": {            "title": "管理员管理",            "icon": "",            "menu":true          },        },                {          "path": "userEdit",          "name": "userEdit",          "component": "Configuration/user/user-Edit.vue",          "meta": {            "title": "编辑用户",            "icon": "",            "menu":false          },        },        ]    },    {      "path": "check",      "name": "check",      "redirect": "check/user",      "component": "check/index.vue",      "roles": ['developer', "admin", "check"], //  developer、admin角色的用户才能访问该页面      "meta": {        "title": "审核",        "icon": "el-icon-location",        "menu":true      },      "children": [{          "path": "user",          "name": "checkUser",          "component": "check/check-user/index.vue",          "meta": {            "title": "用户实名审核",            "icon": "el-icon-location",            "menu":true          }        },        {          "path": "enterprise",          "name": "checkEnterprise",          "component": "check/check-enterprise/index.vue",          "meta": {            "title": "企业认证审核",            "icon": "el-icon-location",            "menu":true          },        },        {          "path": "checkNormImage",          "name": "checkNormImage",          "component": "check/check-norm-image/index.vue",          "meta": {            "title": "标准照认证审核",            "icon": "el-icon-location",            "menu":true          },        },        {          "path": "checkHiringJobs",          "name": "checkHiringJobs",          "component": "check/check-hiring-Jobs/index.vue",          "meta": {            "title": "求职、招聘认证审核",            "icon": "el-icon-location",            "menu":true          },        }      ]    }  ]}, ]export default dynamicRoute

路由管理界面(可能有不完善的地方)

怎么用vue实现动态路由

讲一讲遇到的坑及注意点

1)“component”: “check/check-norm-image/index.vue”, 用字符串再在解析,不要像静态路由一样。否则名列前茅次进去可以,刷新就变空白

2)此处为重要的一点,直接用next()不行

next({      ...to, // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)      replace: true, // 重进一次, 不保留重复历史    })

3)由于添加完路由还会重复执行一遍路由守卫,所有必须确保不要一直死循环添加路由。否则直接崩溃。这里我用的是isToken变量确保不循环。

关于“怎么用vue实现动态路由”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用vue实现动态路由”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

文章标题:怎么用vue实现动态路由,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/25725

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月15日 下午11:43
下一篇 2022年9月15日 下午11:44

相关推荐

  • MySql如何查出符合条件的最新数据行

    结合示例: 这是一张记录人员来访的记录表。 数据表里的数据准确记录了每个人来访时带的帽子颜色、时间、人员编码(每个人少数)。 数据样例: 需要做到的是 : 拿出符合条件的最新的来访记录。 你会最怎么做? 先实现一点的, 取出 A101 这个人员编码的 最新来访记录 。 首先先展示错误的sql示例: …

    2022年9月16日
    54200
  • windows会声会影如何导出视频x9

    会声会影导出视频x9的方法 1、首先点击图示位置的“共享”按钮。 2、然后在图示框中选择想要导出的视频格式。 3、在图示位置可以调整具体参数。 4、最后点击“开始”就可以了。 以上就是“windows会声会影如何导出视频x9”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,…

    2022年9月15日
    55200
  • 如何利用SAP ASE安全漏洞入侵数据库服务器

    SAP公司的Sybase数据库软件中存在一系列新的严重漏洞,没有权限的攻击者可利用这些漏洞完全控制目标数据库,在某些场景中,甚至可完全控制底层操作系统。 网络安全公司Trustware发现的这六个安全漏洞存在于Sybase Adaptive Server Enterprise(ASE)中,Sybas…

    2022年9月16日
    55100
  • vue组件值变化但不刷新问题怎么解决

    今天分享文章“vue组件值变化但不刷新问题怎么解决”,主要从:组件值变化但不刷新强制组件刷新、bug复现、解决等几个方面为大家介绍,希望能帮到您。 组件值变化但不刷新强制组件刷新 在调用组件的时候,如果数据中只是某个属性变化(比如id)变化,在vue开发工具中看到变量值变化,但是组件上的数据就是不刷…

    2022年6月29日
    2.1K00
  • windows默认网关不可用怎么解决

    默认网关不可用解决方法: 1、首先按下“Win+R”打开运行,输入“CMD”并打开。 2、打开管理员界面后,输入命令“netsh winsock reset”并按下回车。 3、然后再输入“netsh int ip reset reset.log”,然后再点击回车运行该命令,然后重启电脑运行。 4、然…

    2022年9月22日
    2.3K00
  • C++怎么实现两个线程交替打印

    首先简单搭一个框架,让两个线程先尝试实现交替打印。 //实现两个线程交替打印#include <iostream>#include <thread>using namespace std;int main(void){ int n = 100; int i = 0; //创建…

    2022年8月27日
    75800
  • Redis处理接口幂等性的方案有哪些

    前言:接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。接口幂等性是指用户对于同一操作发起的一次请求或者多次…

    2022年8月31日
    84100
  • 笔记本电脑键盘打不出字怎么解决

    笔记本键盘打不出字多种解决方法 名列前茅种方法 1、先按住【Fn键】(Fn键一般在键盘的左下角),再按【Num Lk】(Num Lk一般在右上角,F11键的上面,当然不同的笔记本所在位置有所不同),我们可以按这二个组合键进行字母变数字,这也是最常用的方法。 2、点击【开始】菜单,然后选择【程序】,然…

    2022年9月6日
    6.2K00
  • 狩猎内网信息侦察工具Goddi怎么用

    Goddi Goddi 是 NetSPI 使用 Go 语言编写的工具,该工具有助于收集 Active Directory 域信息,被认为是 BloodHound、ADInfo、PowerSploit 和 windapsearch 等其他几种常见工具的替代方案。 Goddi 依赖对域控进行一系列自定义…

    2022年9月26日
    41000
  • windows Office365excl表格冻结窗口在哪

    Office365excl表格冻结窗口位置: 1、首先打开office365,点击新建一个excel表格。 2、然后选中自己需要操作的表格进行编辑。 3、点击上方工具栏中的“视图”。 4、最后点击“冻结窗格”即可完成操作。 关于“windows Office365excl表格冻结窗口在哪”的内容就介…

    2022年9月20日
    58200
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部