千家信息网

怎么使用vue-router实现动态权限控制

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本文小编为大家详细介绍"怎么使用vue-router实现动态权限控制",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么使用vue-router实现动态权限控制"文章能帮助大家解决疑惑,下面跟着小编的
千家信息网最后更新 2026年11月02日怎么使用vue-router实现动态权限控制

本文小编为大家详细介绍"怎么使用vue-router实现动态权限控制",内容详细,步骤清晰,细节处理妥当,希望这篇"怎么使用vue-router实现动态权限控制"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

使用vue开发带权限管理系统,尤其是采用了vue-router做路由,很多人都遇到的一个问题就是如何动态加载路由path对应的component。

典型的应用场景就是:前端菜单不静态的写在vue程序里,而是要从后台程序和数据库返回的菜单来动态加载到vue应用中。

网上很多问权限的问题,但几乎找不到很好的解决答案,在很长一段时间里,非常打击使用vue技术栈开发的信心。问题是:

1)登录之后跳转到首页,此时路由已经是加载完成的了不能更改,菜单可以显示但是没有路由。

2)前端应用人为刷新网页路由产生某些问题。

前提是认真拜读上面提到的那篇文章,下面直接用代码说话:

问题1的解决思路:

登录之后跳转到首页,router是vue应用的router 引入进登录方法,在登录之后跳转之前对router进行改变,改变要点1是精确赋值到router的routes具体地方,比如我这里是routes[0]的子路由,2是用addRoutes函数使其生效。

登录功能的js

export const login = ({commit}, data) => { Service.post('/login', Qs.stringify(data))  .then(res => {   const success = Object.is(res.statusText, 'OK') && Object.is(res.data.code, '0')   if (success) {    var menus = generateMenus(res.data.menus)    window.sessionStorage.routes = JSON.stringify(menus)    if (menuModule.state.items.length <= 0) { // 避免注销后在不刷新页面的情况下再登录重复加载路由     commit(types.ADD_MENU, menus)     // 动态加载路由关键2行     router.options.routes[0].children.push(...generateRoutesFromMenu(menuModule.state.items))     router.addRoutes(router.options.routes)    }    window.sessionStorage.loginName = data.loginName    router.push({path: '/'})   } else {    commit('loginErr', res.data.msg)   }  })}function generateRoutesFromMenu (menu = [], routes = []) { for (let i = 0, l = menu.length; i < l; i++) {  let item = menu[i]  if (item.path) {   routes.push(item)  }  if (!item.component) {   item.component = resolve => require([`views/` + item.component + `.vue`], resolve)   generateRoutesFromMenu(item.children, routes)  } } return routes}

问题2的解决思路:

是不在主app里引入实例化vue-router的js,而是直接在app里实例化router,目的就是网页刷新的时候每次都确保生成动态的router。

app.js部分代码:

Vue.use(Router)let menus = window.sessionStorage.routes //登录成功返回的菜单if (menus) { let items = JSON.parse(menus) store.commit(ADD_MENU, items)}const router = new Router({ mode: 'hash', linkActiveClass: 'is-active', scrollBehavior: () => ({ y: 0 }), routes: [  {   name: 'Main',   path: '/',   component: require('views/Main.vue'),   children: [ //动态路由之所以作为Main的子路由是基于:登录之后跳转到Main主页,该主页是类似于frame的页面加载框架,只有将动态路由作为Main的子路由才能确保其他页面显示到Main框架内。    ...generateRoutesFromMenu(menuModule.state.items)   ]  },  {   name: 'Login',   path: '/login',   component: require('views/Login.vue')  } ]})function generateRoutesFromMenu (menu = [], routes = []) { for (let i = 0, l = menu.length; i < l; i++) {  let item = menu[i]  if (item.path) {   routes.push(item)  }  if (!item.component) {   item.component = resolve => require([`views/` + item.component + `.vue`], resolve)   generateRoutesFromMenu(item.children, routes)  } } return routes}

另附menu items代码

const state = { items: [ // 什么菜单都不定义,完全由后端返回 ]}const mutations = { [types.ADD_MENU] (state, menuItems) {  if (menuItems.length > 0) {   menuItems.map(function (item) {    item.children.map(function (child) {     child.component = lazyLoading(child.component)    })   })   state.items.push(...menuItems)  } },

lazyloding

export default (name, index = false) => () => import(`views/${name}${index ? '/index' : ''}.vue`)

读到这里,这篇"怎么使用vue-router实现动态权限控制"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

路由 动态 登录 问题 权限 菜单 应用 控制 代码 就是 思路 文章 页面 主页 内容 前端 实例 框架 程序 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网巨头科技公司 深圳互联网络科技有限公司 猪兼强互联网科技 互联网金融科技创新 天津摩尔互联网科技 赫美联合互联网科技 互联网科技小额贷款 互联网科技博客 温州喔噻互联网科技有限公司 昭通云南众福互联网科技有限公司 荆州市昕露互联网络科技有限公司 智腾互联网科技有限公司 宜昌元轩互联网科技有限公司 中国科技创新与世界互联网大会 每天都有哪些好的互联网科技 福建互联网展示科技馆设计 广西科技产业互联网是什么 中国互联网公司的科技投入 互联网的科技体现在哪里 科技互联网专业工作会议发言稿 艾特科技互联网 互联网金融科技平台 互联网科技缩写 海南购全球互联网科技 承德科技产业互联网发展 互联网科技大赛获奖感言 张召忠谈中国互联网科技 北京品多多互联网科技有限公司 保山浩联互联网科技有限公司 高科技和互联网的现代国家
0