import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
// 路由守卫
let registerRouteFresh = true // 定义标识,记录路由是否添加
router.beforeEach(async (to, from, next) => {
let res = [ // 路由数据,正常情况通过接口获取,这里我使用假数据代替
{
"id": 1000,
"parentId": -1,
"icon": "user",
"name": "用户",
"path": "/user",
"routerName": 'user',
"component": "views/user/User.vue",
"redirect": '/user/set',
"children": [{
"id": 1100,
"parentId": 1000,
"icon": "use-set",
"name": "用户管理",
"routerName": 'userSet',
"path": "/user/set",
"component": "views/user/User.vue",
"redirect": null
}],
},
{
"id": 2000,
"parentId": -1,
"icon": "test",
"name": "测试",
"path": "/test",
"routerName": 'test',
"component": "view/test/index",
"redirect": '/test/user',
"children": [{
"id": 2100,
"parentId": 2000,
"icon": "test-user",
"name": "用户测试",
"routerName": 'testUser',
"path": "/test/user",
"component": "views/user.User.vue",
"redirect": null
}]
},
]
let arr = [] // 整理后台数据,转换为添加路由的格式
res.filter((value) => {
let child = [] // 子路由数据格式处理
if (value.children && value.children.length) {
value.children.filter((val) => {
child.push({
name: val.routeName,
path: val.path,
component: () => import(`@/${val.component}`) // 开发中遇到问题,不能使用纯变量,需要字符串拼接才可以,要不然同样的地址报错。
})
})
}
arr.push({
name: value.routeName,
redirect: value.redirect,
path: value.path,
component: () => import(`@/${value.component}`),
children: child
})
})
// 如果首次或者刷新界面,next(...to, replace: true)会循环遍历路由,如果to找不到对应的路由那么他会再执行一次beforeEach((to, from, next))直到找到对应的路由,
// 我们的问题在于页面刷新以后异步获取数据,直接执行next()感觉路由添加了但是在next()之后执行的,所以我们没法导航到相应的界面。这里使用变量registerRouteFresh变量做记录,直到找到相应的路由以后,把值设置为false然后走else执行next(),整个流程就走完了,路由也就添加完了。
if (registerRouteFresh) {
arr.forEach((val) => {
router.addRoute(val)
})
next({...to, replace: true})
registerRouteFresh = false
} else {
next()
}
})
createApp(App).use(store).use(router).mount('#app')