Vue动态菜单addRoutes的使用和踩坑事项
坑一 添加route后马上跳转可能出现白屏情况
原因分析:
还未成功添加就next()
跳转,找不到组件
解决办法:
使用next()
传参,在路由守卫beforeEach
中持续循环,知道确认已经添加成功,代码如下
router.beforeEach((to, from, next) => {
if (store.getters.roles.length === 0) {
store.dispatch('GenerateRoutes').then(accessRoutes => {
router.addRoutes(accessRoutes) // 动态添加可访问路由表
next({ ...to, replace: true })
})
} else {
next()
}
})
next()传参的作用是继续还会走beforeEach
而不是直接进入某个路由
beforeEach((to, from, next) => {
next('/logon')
}
这行代码并不是直接进入 /logon
而是会一直循环在这里,知道遇到`next()`
正确代码
beforeEach((to, from, next) => {
if(to.path === '/home') {
next('/logon')
} else {
// 如果要去的地方不是 /home , 就放行
next()
}
}
坑二 找不到component
而是组件component的引入,在服务器传递回来的组件是地址是字符串需要获取对应的组件
// 遍历后台传来的路由字符串,转换为组件对象
function filterAsyncRouter(asyncRouterMap, lastRouter = false) {
return asyncRouterMap.filter(route => {
if (route.component) {
// Layout ParentView 组件特殊处理
if (route.component === 'Layout') {
route.component = Layout
} else if (route.component === 'ParentView') {
route.component = ParentView
} else if (route.component === 'InnerLink') {
route.component = InnerLink
} else {
route.component = loadView(route.component)
}
}
if (route.children != null && route.children && route.children.length) {
route.children = filterAsyncRouter(route.children, route, type)
} else {
delete route['children']
delete route['redirect']
}
return true
})
}
const loadView = (view) => {
if (process.env.NODE_ENV === 'development') {
return (resolve) => require([`@/views/${view}`], resolve)
} else {
// 使用 import 实现生产环境的路由懒加载
return () => import(`@/views/${view}`)
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?