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

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM