搭建一个vue2的动态路由框架,现状是动态路由能添加成功,但是界面出不来。如下
router/index.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import store from '@/store';
import NProgress from 'nprogress' //导航条
import "nprogress/nprogress.css"//导航条样式
import { Message } from 'element-ui'
import { setData1, getData1 } from '@/utils/cache'
import login from '@/views/login'
Vue.use(VueRouter)
// 解决编程式路由往同一地址跳转时会报错的情况
// const originalPush = VueRouter.prototype.push
// VueRouter.prototype.push = function push(location) {
// return originalPush.call(this, location).catch(err => err)
// }
//静态路由
const routes = [
{
path: '/',
redirect: '/login'
},
{
path: '/login',
name: '登录',
component: login
},
]
const router = new VueRouter({
routes
})
// 解析路由
function setChild(me, routerList, rootName, rootPath) {
rootName = rootName + '/' + me.name
rootPath = rootPath + '/' + me.path
if (me.children != null && me.children != [] && me.children.length > 0) {
//如果有下层
me.children.forEach(node => {
setChild(node, routerList, rootName, rootPath)
})
} else {
//没有下层则说明这是一个路由
let rou = {
name: rootName,
path: rootPath,
component: () => import('@/views' + rootPath)
}
routerList.push(rou)
}
}
let isAddRoute = true //阀门变量 避免重复添加
router.beforeEach(async (to, from, next) => {
console.log(to);
if (isAddRoute && store.state.routers.length != 0) {
let dynamicRoutes = await JSON.parse(JSON.stringify(store.state.routers))
//添加动态路由
let routerList = []
dynamicRoutes.forEach(v => {
setChild(v, routerList, '', '')
})
let initHome = {
path: '/home',
name: 'home',
meta: {
name: 'home',
},
component: () => import('@/views/home'),
children: dynamicRoutes
}
router.addRoute(initHome);
router.addRoute({
path: '*',
hidden: true,
component: () => import( /* webpackChunkName: "error" */ '@/views/error'),
name: '404',
})
console.log(router.getRoutes());
isAddRoute = false //关闭阀门,否则会一直循环崩溃
next({ ...to, replace: true }) // next({ ...to })的目的,是保证路由添加完了再进入页面 (可以理解为重进一次)
} else {
next()
}
})
router.afterEach((to, from) => {
NProgress.done()
window.scrollTo(0, 0)
if (to.name) {
document.title = to.name
}
})
export default router