【Vue】一文说明Vue-Router如何进行路由配置拆分,路由自动导入,和全局前置守卫
写在前面:
路由管理是Vue项目的必备项,但是当项目稍成规模时,为了保证项目的模块化和可维护性,配置Vue-Router进行路由配置拆分,配置自动导入就显得很重要了
教程如下(1.编写index.js->2.导入路由->3.分模块编写路由):
1.编写index.js(完整代码在文末):
index.js
是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
文件夹直接编写路由了,无需逐个导入
完整代码:
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.分模块编写路由
创作不易,点个赞吧~
转载自:https://juejin.cn/post/7259043740543467581