详解基于vue-router的动态权限控制实现方案

发布时间 - 2026-01-11 03:27:30    点击率:

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

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

网上很多问权限的问题,但几乎找不到很好的解决答案,在很长一段时间里,非常打击使用vue技术栈开发的信心。最有质量的一篇文章是:https://www./article/124801.htm

但作者并没有完全解决这个问题,还留有几个问题是:

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`)

git代码暂不能全部公开,有问题可留言。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# vue  # router  # 权限  # vue-router  # 动态权限  # vuerouter  # 权限控制  # Vue后台管理系统权限控制与动态路由的实现  # vue自定义指令和动态路由实现权限控制  # vue实现权限控制路由(vue-router 动态添加路由)  # Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制  # vue中动态权限控制的实现示例  # 加载  # 跳转到  # 使其  # 首页  # 很好  # 都不  # 尤其是  # 管理系统  # 基础上  # 找不到  # 很多人  # 这两个  # 采用了  # 问题是  # 有几个  # 最有  # 很长  # 一个问题  # 跳转  # 这篇文章 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JS碰撞运动实现方法详解  如何在 React 中条件性地遍历数组并渲染元素  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  用v-html解决Vue.js渲染中html标签不被解析的问题  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  三星、SK海力士获美批准:可向中国出口芯片制造设备  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  JavaScript中的标签模板是什么_它如何扩展字符串功能  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Laravel如何创建自定义中间件?(Middleware代码示例)  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  如何在Windows虚拟主机上快速搭建网站?  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  Laravel模型事件有哪些_Laravel Model Event生命周期详解  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  js实现点击每个li节点,都弹出其文本值及修改  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  如何用JavaScript实现文本编辑器_光标和选区怎么处理  北京网站制作的公司有哪些,北京白云观官方网站?  高防服务器:AI智能防御DDoS攻击与数据安全保障  Laravel如何实现API版本控制_Laravel版本化API设计方案  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  Android使用GridView实现日历的简单功能  开心动漫网站制作软件下载,十分开心动画为何停播?  微信小程序 scroll-view组件实现列表页实例代码  Swift开发中switch语句值绑定模式  如何构建满足综合性能需求的优质建站方案?  如何用y主机助手快速搭建网站?  PHP 500报错的快速解决方法  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何做网站制作流程,*游戏网站怎么搭建?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  Bootstrap CSS布局之列表  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  微信h5制作网站有哪些,免费微信H5页面制作工具?  Laravel如何实现文件上传和存储?(本地与S3配置)  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Laravel如何实现本地化和多语言支持?(i18n教程)