账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    vue-router addRouter添加动态路由,第一次跳转正常,刷新后变空白?
    • 2019-07-10 00:00
    • 11
    33
    0

    我想用addRouter动态添加权限过滤路由,登陆成功跳转动态路由页面this.$router.push({path:'/page1/list'})正常,刷新就空白了
    下面上代码:

    在router.js中定义号常规路由和动态路由:

    export const constantRouter = [
        {
            path: '/login',
            name: 'login',
            hidden: true,
            component: () => import('@/views/login')
        },
    
        {   path:'/home',
            name:'home',
            meta:{ title:'list',icon:''},
            component: () => import('@/views/home'),
        },
        { path: '/', redirect: '/login', hidden: true }
    ]
    
    export default new Router({
        routes: constantRouter
    })
    
    export const asyncRouter = [
        {
            path: '/page1',
            component: layout,
            alwaysShow: true, // will always show the root menu
            name: 'page1',
            redirect: '/page1/list',
            meta:{ title:'list',icon:''},
            children: [
                {
                    path: 'list',
                    component: () => import('@/views/list'),
                    name:'list',
                    meta:{ title:'list',icon:''},
                },
                {
                    path: 'edit',
                    component: () => import('@/views/form'),
                    name:'edit',
                    hidden:true,
                    meta:{ title:'edit',icon:''},
                },
                {
                    path: 'detail',
                    component: () => import('@/views/detail'),
                    name:'detail',
                    hidden:true,
                    meta:{ title:'detail',icon:''},
                },
            ]
        },
        {
            path: '/page1',
            component: layout,
            name: 'page2',
            meta:{ title:'list',icon:''},
            children: [
                {
                    path: '/test',
                    component: () => import('@/views/test'),
                    name:'test',
                    meta:{ title:'test',icon:''},
                },
            ]
    
        },
        {   path:'*',
            name:'errorPage404',
            hidden: true,
            component: () => import('@/views/404'),
        }
    ]

    之后在main.js中addRouter:

    import router from './router'
    router.beforeEach((to, from, next) => {
        if(to.path !== '/login'){
            if(sessionUtil.getItem('recombineRouters')){
                next()
            }else{
    
                let privileges = ['list','edit'];
                let permission_routes = routeUtil.GenerateRoutes(privileges);
                router.addRoutes(permission_routes);
                console.log(router);
                next({ ...to, replace: true })
            }
        }else{
            next();
        }
    })

    其中过滤动态路由的方法GenerateRoutes,我没有用vuex,只是写了个过滤路由的方法:

    function GenerateRoutes(privileges){
        var f = item => {
            if(item.path === '*'){
                return true;
            }else{
                if(item.children && item.children.length > 0){
                    item.children = item.children.filter(f);
                    if(item.children.length>0){
                        item.redirect = item.children[0].path;
                        return true;
                    }else{
                        return false;
                    }
                }else{
                    return (privileges.indexOf(item.name) > -1)
                }
            }
        }
    
        let accessedRouters = asyncRouter.filter(f);
        let recombineRouters = constantRouter.concat(accessedRouters);
        sessionUtil.setItem('recombineRouters',recombineRouters);
        return accessedRouters;
    }

    我的router是v3.0.1
    首先,*(404)是写在动态路由之后的,
    其次,addRouter后没有用next(),而是使用 next({ ...to, replace: true })代替
    但是还是没有解决问题,求大神帮忙!

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 欲望本就很美 普通会员 1楼

      在 Vue.js 中,你可以使用 addRouter 方法来添加动态路由。但要注意,添加动态路由并不会自动刷新页面,你需要手动刷新页面才能看到新的路由。

      下面是一个简单的例子:

      ```javascript import Vue from 'vue' import Router from 'vue-router'

      Vue.use(Router)

      new Router({ routes: [ { path: '/user/:id', component: User } ] }) ```

      在这个例子中,当用户访问 /user/123 时,将会跳转到 /user/123 的组件。刷新页面后,用户应该可以看到新的路由。

      如果你使用的是 Vue Router 的动态路由插件,例如 vue-router动态路由插件,则可以在 setup 函数中进行动态路由的配置。例如:

      ```javascript import Vue from 'vue' import Router from 'vue-router'

      import DynamicRoute from 'vue-router-dynamic-route'

      Vue.use(DynamicRoute)

      new Router({ routes: [ { path: '/user/:id', component: User } ] }) ```

      在这个例子中,当用户访问 /user/123 时,将会跳转到 /user/123 的组件。刷新页面后,用户应该可以看到新的路由。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部