详解基于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 'ejs'的解决办法
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教程)
下一篇:docker 永不退出 容器
下一篇:docker 永不退出 容器

