zoukankan      html  css  js  c++  java
  • vue-router 路由拦截 beforeEach 添加静态路由 与 动态添加路由

    1。router/index.js

    import Vue from 'vue'
    import Router from 'vue-router'
    import Login from '../components/page/login'
    import Error from '../components/a/404'
    
    import NProgress from 'nprogress'//加载进度条
    
    import Main from '../components/a/main'
    
    Vue.use(Router)
    
    NProgress.inc(0.2)
    NProgress.configure({ easing: 'ease', speed: 500, showSpinner: false })
    
    
    const staticRouter = [
        {
            path: '/',
            component: Login
        },
        {
            path: '/404',
            component: Error
        },
    ];
    
    const createRouter = () => new Router({
        mode: 'history',
        routes : staticRouter
    });
    
    const router = createRouter();
    
    const asyncRouterArr = [
        {
            path:'/main',
            component:Main,
        },
    ]
    
    /**
     * 重定向不要添加到原始路由中,要不然都会重定向到某页面
     * 重定向在添加路由时,最后添加进去
     * */
    
    router.beforeEach((to, from, next) => {
        NProgress.start();
        console.log(to, from);
        if(to.fullPath != '404'){
            let _this = router.app;
            //判断用户是否登录
            if(!_this.$store.state.isLogin){
                //已登录
                if(localStorage.getItem("token")){
                    _this.$store.dispatch('getNavData').then((res)=>{
                        let navList =  _this.$store.state.navList;
                        navList.push({path:'*',redirect:'/404'});
                        _this.$router.options.routes= navList;
                        _this.$router.addRoutes(navList);
                        next(to.fullPath);
                    })
                }else{
                    if (to.path !== '/') {
                        next(from.fullPath)
                    } else {
                        // next(from.fullPath)
                        next()
                    }
                }
    
            }else{
                //判断vuex中state的navList是否有值,
                if(_this.$store.state.navList.length > 0){
                    //有值的话,代表从后台获取到登录成功的路由权限,继续往下走
                    next();
                }else{
                    //没值的话,代表是浏览器手动刷新,vuex中的数据设为初始值
                    _this.$store.dispatch('getNavData').then((res)=>{
                        let navList =  _this.$store.state.navList;
                        navList.push({path:'*',redirect:'/404'});
                        _this.$router.options.routes= navList;
                        _this.$router.addRoutes(navList);
                        next(to.fullPath);
                    })
                }
            }
        }else{
            next();
        }
    
    })
    
    router.afterEach(()=>{
        NProgress.done();
    });
    
    export function resetRouter(){
        const newRouter = createRouter();
        router.matcher = newRouter.matcher; //reset router
    }
    
    export default router;
    

      

  • 相关阅读:
    socket使用大全
    UIImageView控件使用(转)
    多线程,socket,http,asihttpRequest,等总结集合
    ios 如何判断字符串含有中文字符?
    修改UISearchBar
    abc222_e Red and Blue Tree(树上差分+01背包)
    2020icpc上海部分题解
    abc215_e Chain Contestant(状压dp)
    bzoj3238 差异(后缀数组+单调栈)
    NCD2019部分题解
  • 原文地址:https://www.cnblogs.com/dyy-dida/p/11866777.html
Copyright © 2011-2022 走看看