likes
comments
collection
share

【Vue】一文说明Vue-Router如何进行路由配置拆分,路由自动导入,和全局前置守卫

作者站长头像
站长
· 阅读数 14

写在前面:

路由管理是Vue项目的必备项,但是当项目稍成规模时,为了保证项目的模块化和可维护性,配置Vue-Router进行路由配置拆分,配置自动导入就显得很重要了

教程如下(1.编写index.js->2.导入路由->3.分模块编写路由):

1.编写index.js(完整代码在文末):

index.js是vue-router的配置文件,我们只需要配置好这个文件就可以实现路由拆分以及自动导入,全局前置守卫等

【Vue】一文说明Vue-Router如何进行路由配置拆分,路由自动导入,和全局前置守卫

首先在项目src/router文件夹新建一个index.js以及/router/modules,导入Vue和VueRouter模块:

import Vue from 'vue'
import VueRouter from 'vue-router'

然后,通过使用require.context方法加载@/router/modules目录下所有以.js结尾的文件,并创建了一个函数requireAll来处理加载的文件。

const req = require.context('@/router/modules', false, /.js$/)
const requireAll = requireContext => {
  return requireContext.keys().map(requireContext);
}

接下来,创建了一个空数组arr

let arr = []

通过遍历通过requireAll函数加载的文件,并将每个文件的default对象加入到arr数组中。

requireAll(req).forEach(item => {
  console.log(item);
  arr = arr.concat(item.default)
})

使用Vue.use()方法来使用VueRouter插件。

Vue.use(VueRouter)

定义一个routes数组,并使用扩展运算符(...)来将arr数组中的对象合并到routes数组中。

const routes = [
  ...arr
]

创建一个VueRouter实例,并传入了routes数组作为配置参数。

const router = new VueRouter({
  routes
})

最后,定义一个全局前置守卫(beforeEach),在每次导航之前将to路由对象的meta.title属性设置为文档的标题,并调用next()函数继续导航。

router.beforeEach((to, from, next) => {
  document.title = to.meta.title
  next()
})

最后,导出了router对象作为默认导出。

export default router

到此,就实现了配置Vue Router,并使用动态导入加载了@/router/modules目录下的所有路由配置文件,然后创建了VueRouter实例并导出。在导航之前还使用了前置守卫来设置文档标题,接下来只需要在modules文件夹创建路由模块直接使用即可

2.导入路由

main.js

import router from './router'

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

3.分模块编写路由

完成以上工作后,就可以在modules文件夹直接编写路由了,无需逐个导入

【Vue】一文说明Vue-Router如何进行路由配置拆分,路由自动导入,和全局前置守卫

完整代码:

import Vue from 'vue'
import VueRouter from 'vue-router'

const req = require.context('@/router/modules',false, /\.js$/)
const requireAll = requireContext => {
    return requireContext.keys().map(requireContext);
}
let arr = []
requireAll(req).forEach(item => {
  console.log(item);
  arr = [...arr,...item.default]
  
})
Vue.use(VueRouter)

const routes = [
  ...arr
]

const router = new VueRouter({
  routes
})

router.beforeEach((to,from,next)=>{
  document.title = to.meta.title
  next()
})

export default router

总结:

1.编写index.js->2.导入路由->3.分模块编写路由

创作不易,点个赞吧~