router.beforeEach()一般用来做一些进入页面的限制。
比如没有登录,就不能进入某些页面,只有登录了之后才有权限查看某些页面, 说白了就是路由拦截。
第一步 规定进入路由需不需要权限
@/router/index.js
import A from '@/components/a'
{
path: '/a',
name: 'a',
component: A,
meta : { //加一个自定义obj
requireAuth:true //这个参数 true 代表需要登录才能进入A
}
},
第二步 使用vuex整一个userId
@/assets/store.js
//使用vuex三步走
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
//这个理论来说
const store = new Vuex.Store({
state:{
userId : ''
}
})
export default store
第三步 使用router.
@/main.js
思路:【
如果(即将进入的这个路由需要权限才能进入){
如果(能获取到这个老哥的userID){
就让这个老哥进入这个路由
}否则{
就让这个老哥进入b这个页面
}
} 即将进入的路由不需要权限就能进入 {
就让这个老哥进入这个路由
}
】
对应代码:
import store from '@/assets/store' //把这个userId获取过来
router.beforeEach((to,from,next)=>{
if(to.meta.requireAuth){
if(store.state.userId){
next()
}else{
next({path:'/login'})
}
}else{
next()
}
})
技术解释
当触发守位函数时,如果遇到next("/xxx")时,会将原本的导航中断,
然后将to.path改成next("/xxx")中的地址,然后重新触发这个离开的守位函数。
注意:会重新触发执行这个守位函数,而不是在这个钩子函数中继续执行。
不要错误的认为next("/xxx")就直接去跳转了。所以当重新触发后就会继续执行,
逻辑不完整就会造成死循环或不跳转等错误。
第四步
第三步这个/login路由其实就是登陆页面,
当进入A页面之前,需要请求接口,获取一下是否有登陆过,然后把这个userId存在vuex的state里。
当没有userId时,则在登陆之后,存一个userId到state里。然后就敲完收工