1、背景vue
在vue项目中使用vue-router作页面跳转时,路由的方式有两种,一种是静态路由,另外一种是动态路由。而要实现对路由的控制须要使用vuex和router全局守卫进行判断拦截(安全问题文章最后讨论)ios
2、使用场景es6
静态路由的使用场景:在咱们使用静态路由实现页面跳转时,无论咱们是否登陆,当咱们在地址栏修改地址后,页面会发生跳转并展现页面内容(数据并不会被展现出来),这样的问题显然是不可以被接受的;vue-router
动态路由的使用场景:动态路由无非就是从后端拿到了数据而后在加到router里面了。假如用户登陆了,在地址栏修改地址便能直接访问。因此动态路由并不能起到拦截做用。vuex
3、解决方案axios
使用vuex+router.beforeEach()+动态路由实现页面拦截后端
页面刷新时会清楚vuex里面的值;(防止直接修改地址栏)安全
router.beforeEach()对跳转前进行拦截判断;(对vuex里面的值进行判断)ide
当用户登陆时请求后台拿到数据,加载路由.(跳转页面)函数
4、实现过程
1.首先定义vuex里面的值,须要定义两个值:a.登陆状态信息的值 loginInfo b.存储动态路由的值 routerList
2.router.beforeEach()对路由跳转前进行控制
//全局守卫 router.beforeEach((to, from, next)=> { let userId = store.state.loginInfo.id; //这里是对登陆后的值进行判断,也可对token的值进行判断 if (userId === '') { if (to.meta.requireAuth || to.name == null) { next({path: '/'}) } else { next(); } } else { //初始化动态路由方法 initRouter(router, store); next(); } } );
3.初始化动态路由
在全局守卫对应条件下加载动态路由数据routerList和在登陆成功时存储登陆成功的信息loginInfo
新建一个xxx.js文件 引入axios 建立一个函数并使用export 暴露该方法;
请求成功拿到数据后,把数据形成和routes里的数据同样。而后使用 router.addRoutes 添加进去;
index中的默认路由
import axios from 'axios' export const initRouter = (router,store)=>{ if (store.state.routerList.length > 0) { return; } axios.get(' URL') .then((rest)=>{ let routerList = []; if(rest.data.success){ let routers = rest.data.body; routers.forEach(router=>{ let { path, component, name, } = router let routerObj = { path:path, name:name, component(resolve){ if (component.startsWith("index")) { require(['../components/' + component + '.vue'], resolve) } }, meta:{requireAuth:true} //是不是登陆权限控制 }; routerList.push(routerObj); }); //add到router中 router.addRoutes(routerList); //存储到vuex中 store.commit('routerList', routerList); }else{ console.log(rest.data.error); } }).catch((error)=>{ console.log(error); }) }
4.登陆成功后存储成功状态信息并跳转页面
至此,页面拦截功能已实现。
5、总结
该方法实现主要用到了:
1.vuex及页面刷新时会对vuex进行清空,因此好比退出时要对页面window.location.reload(),其它地方相似。
2.router.beforeEach()钩子函数及关键的router.addRoutes方法
3.es6的一些写法