vue项目实战:路由文件的配置

/*
 * @Description: 路由入口配置文件 index.js文件
 * @Version: 2.0
 * @Autor: lhl
 * @Date: 2020-06-10 15:53:32
 * @LastEditors: lhl
 * @LastEditTime: 2020-08-20 17:05:28
 */
import Vue from 'vue'
import Router from 'vue-router'
import vuecodeRouterModule from './vuecodeRouter'
import elementRouterModule from './elementStudyRouter'
// import HelloWorld from '@/components/HelloWorld' // 基础写法,没有懒加载,打包分离代码

// 导入进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 简单配置 详细看  https://github.com/rstacruz/nprogress
NProgress.inc(0.1)
NProgress.configure({ easing: 'ease', speed: 600, showSpinner: false })

Vue.use(Router)

// 1、vue异步组件 --> 第一种: 异步组件将每一个组件生成一个js文件
// 2、es6中import懒加载 ---> 第二种: 会将webpackChunkName名字相同的生成一个js文件    
// 3、webpack提供的require.ensure() r就是resolve的意思 ---> 第三种:和第二种方法类似但是可以单独引入依赖会将名字相同的生成一个js文件    

// 解决菜单多次点击报错的问题 fix vue-router NavigationDuplicated
const VueRouterPush = Router.prototype.push
Router.prototype.push = function push (location) {
  return VueRouterPush.call(this, location).catch(err => err)
}
const VueRouterReplace = Router.prototype.replace
Router.prototype.replace = function replace (location) {
  return VueRouterReplace.call(this, location).catch(err => err)
}

const router = new Router({
  routes: [{
      path: '/',
      redirect: '/dashboard'
    },
    {
      path: '/login',
      name: 'login',
      component: () => import('@/page/login/login')
    },
    {
      path: '/',
      name: 'home',
      component: () => import('@/components/layout/home'),
      children: [{
          path: '/dashboard',
          name: 'dashboard',
          component: () => import('@/page/dashboard/index.vue'), // 第一种方式:ES6的import()方法---按需加载(常用)
          // component: resolve => require(['@/page/dashboard/index.vue'], resolve), // 第二种方式:vue的异步组件,require()方法。(按需加载)
          // component: r => require.ensure([], () => r(require('@/page/dashboard/index.vue')), 'dashboard'), // 第三种方式:webpack提供的require.ensure()  r就是resolve的意思
          // component: () => import(/* webpackChunkName: "dashboard" */ '@/page/dashboard/index.vue'), // 最优官方,懒加载和打包分离代码。(项目推荐使用)一个特殊的注释语法来提供 chunk name (需要 Webpack > 2.4)
          meta: {
            title: '首页'
          }
        },
        {
          path: '/baiduMapTest',
          name: 'baiduMapTest',
          component: () => import('@/page/baiduMap/baiduMapTest.vue'), 
          meta: {
            title: '百度地图'
          }
        },
        {
          path: '/vueBaiduMap',
          name: 'vueBaiduMap',
          component: () => import('@/page/baiduMap/vueBaiduMap.vue'),
          meta: {
            title: 'vue百度地图'
          }
        },
        ...vuecodeRouterModule,
        ...elementRouterModule,
        {
          path: '*',
          name: '404',
          component: () => import('@/page/404/notFound')
        }
      ]
    }
  ]
})

import store from '../store'

const whiteList = ['/login'] // no redirect whitelist 白名单不需要登录
// 路由全局前置钩子
router.beforeEach((to, from, next) => {
  // console.log(to,'to')
  // 开启进度条
  NProgress.start();
  // url 注入  直接url进来
  // if(to.name != 'login' && to.name != 'dashboard'){
  //   localStorage.setItem('path', JSON.stringify(to.name))
  //   localStorage.setItem('query', JSON.stringify(to.query))
  // }
  /*登录界面登录成功之后,会把用户信息保存在会话
  存在时间为会话生命周期,页面关闭即失效。
  这里还可以做全局的loading 效果 在 router.afterEach 关闭 */
  
  // 网页标题
  if(to.meta.title){
    document.title = `${to.meta.title} | vue-manage`;
  }
  
  const token = store.state.user.token;
  // console.log(token,'token')

  if(token){
    if(to.path === '/login'){
      next({
        path: to.query.redirect || '/',
        query: {}
      })
    } else {
      next()
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      // 点击退出时,会定位到这里
      next()
    } else {
      next({
        path: '/login',
        query: { redirect: to.fullPath }
      })
      NProgress.done()
    }
  }
})

// 路由全局后置钩子
router.afterEach((to, from) => {
  // 进度条加载完毕
  NProgress.done()
})

export default router

// 备注 vue2.2.0 以后新增了router.addRoutes 添加动态路由 比如 登录进去才可以看得到的路由 一些权限路由
// router.addRoutes(routes: Array<RouteConfig>)
// 动态添加更多的路由规则。参数必须是一个符合 routes 选项要求的数组
// 使用:
// this.$router.options.routes = routes; // 是因为,router.options.routes 不是响应式的
// this.$router.addRoutes(routes);

// 如果路由报错 Uncaught (in promise) Error: Redirected from "/dymicFrom" to "/login" via a navigation guard. 退出登录时候 location.reload();


/*路由的 meta 属性里面添加 keepAlive 值为 true or false  keep-alive标签上使用 include、exclude max属性控制需要缓存的组件(对应组件写上name:'xxx')
  <keep-alive>
    <router-view v-if='$route.meta.keepAlive'></router-view>
  </keep-alive>
  <router-view v-if='!$route.meta.keepAlive'></router-view>
*/
/*
 * @Description: element-ui用法 知识点路由
 * @Version: 2.0
 * @Autor: lhl
 * @Date: 2020-07-20 10:54:04
 * @LastEditors: lhl
 * @LastEditTime: 2020-08-07 10:16:33
 */ 

const elementRouterModule = [
  {
    path: '/dymicFrom',
    name: 'dymicFrom',
    component: () => import('@/page/usualElementStudy/dymicFrom'),
    meta: {
      title: 'element-ui动态组件'
    }
  },
  {
    path: '/elementTable',
    name: 'elementTable',
    component: () => import('@/page/usualElementStudy/elementTable'),
    meta: {
      title: 'element-ui表格的常规用法'
    }
  },
  {
    path: '/tableDetail',
    name: 'tableDetail',
    component: () => import('@/page/usualElementStudy/tableDetail'),
    meta: {
      title: '详情界面'
    }
  }
]
export default elementRouterModule
/*
 * @Description: vue语法糖知识点路由
 * @Version: 2.0
 * @Autor: lhl
 * @Date: 2020-07-06 13:42:28
 * @LastEditors: lhl
 * @LastEditTime: 2020-08-13 18:01:00
 */ 
const vuecodeRouterModule = [
  {
    path: '/parent',
    name: 'parent',
    component: () => import('@/page/vueStudy/parent'),
    meta: {
      title: 'vue组件通信'
    }
  },
  {
    path: '/funCom',
    name: 'funCom',
    component: () => import('@/page/vueStudy/funCom'),
    meta: {
      title: 'vue函数式组件'
    }
  },
  {
    path: '/vueRouterParmas',
    name: 'vueRouterParmas',
    component: () => import('@/page/vueStudy/vueRouterParmas'),
    meta: {
      title: 'vue路由传参'
    }
  },
  {
    path: '/vueRouterDefend',
    name: 'vueRouterDefend',
    component: () => import('@/page/vueStudy/vueRouterDefend'),
    meta: {
      title: 'vue守卫'
    }
  },
  {
    path: '/vueGrammar',
    name: 'vueGrammar',
    component: () => import('@/page/vueStudy/vueGrammar'),
    meta: {
      title: 'vue语法糖总结'
    }
  },
]
export default vuecodeRouterModule

  以上代码本人项目实测!!!真实可靠,请勿随意转载~转载请注明出处~~~谢谢合作!

posted @ 2020-08-20 17:07  鱼樱前端  阅读(1963)  评论(0编辑  收藏  举报