# Vue项目添加Router

# 一、安装

在使用 vue-cli3.0 搭建Vue项目时,会有提示安装 vuex router等选项,可以直接选择。

npm install vue-router

# 二、添加router

1、创建router文件

在src目录下创建router文件来添加router实例。

// router/index.js

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

// hack router push callback
const originalPush = Router.prototype.push
Router.prototype.push = function push (location, onResolve, onReject) {
  if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject)
  return originalPush.call(this, location).catch(err => err)
}

// 引入路由
const IndexComponent = () => import(/* webpackChunkName: 'indexs' */ '@/views/index/index.vue')

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/index',
      name: 'index',
      component: IndexComponent
    }
  ]
})

注册到Vue实例上:

// main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

拆分模块

如果路由过大,可以进行路由拆分,就是单纯的把路由 routes 数组拆分开到不同文件中去。

在src目录下创建 router 文件夹:

└── src
  ├── main.js
  └── router           # router文件
      ├── index.js     # 我们组装模块并导出 router 的地方
      ├── a.js         # 模块a
      └── b.js         # 模块b

a模块:

// a.js

const A1Component = () => import(/* webpackChunkName: 'a' */ '@/views/a1/a1.vue')
const A2Component = () => import(/* webpackChunkName: 'a' */ '@/views/a2/a2.vue')

export default [
  {
    path: '/a1',
    name: 'a1',
    component: A1Component
  },
  {
    path: '/a2',
    name: 'a2',
    component: A2Component
  }
]

b模块:

// b.js

const B1Component = () => import(/* webpackChunkName: 'b' */ '@/views/b1/b1.vue')
const B2Component = () => import(/* webpackChunkName: 'b' */ '@/views/b2/b2.vue')

export default [
  {
    path: '/b1',
    name: 'b1',
    component: B1Component
  },
  {
    path: '/b2',
    name: 'b2',
    component: B2Component
  }
]

合并到index.js文件:

// index.js

import Vue from 'vue'
import Router from 'vue-router'
import a from './a.js'
import b from './b.js'

const IndexComponent = () => import(/* webpackChunkName: 'indexs' */ '@/views/index/index.vue')

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/index',
      name: 'index',
      component: IndexComponent
    },
    ...a,
    ...b
  ]
})

# 三、使用

# 1、在组件中使用

在vue中直接通过this来进行调用。

export default {
  created() {
    console.log(this.$route) // 路由元信息
  },
  methods: {
    routerLink() {
      this.$router.push({
        name: 'Home',
        params: {}
        query: {}
      })
    }
  }
}

# 2、在 js引入使用

与vuex一样,直接引入router实例就可以调用路由方法了。

// test.js
import router from '@/router'

router.beforeEach((to, from, next) => {
  console.log(to)
  next()
})

router.afterEach(() => {
  
})