在项目登录之前需要登录,根据用户登录信息进行判断需要跳转到所设置的路由,通过Vue-router提供的beforeEach属性就可以实现这个功能,通过一段代码来看看是如何实现这个功能的:
使用 router.beforeEach 注册一个全局前置守卫:
const router = new Router({ ... })
router.beforeEach((to, from, next) => {
// to: Route: 即将要进入的目标 路由对象
// from: Route: 当前导航正要离开的路由
// next: Function: 进行管道中的下一个钩子。
})
当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。 每个守卫方法接收三个参数:
1.to: Route
: 即将要进入的目标
2.from: Route
: 当前导航正要离开的路由
3.next: Function
: 需要导航的路由,(注意:必须要调用该方法来 resolve 这个钩子函数。执行依赖 next
方法的调用参数)
(1)next(): 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。
(2)next(false): 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到 from 路由对应的地址。
(3)next('/') 或者 next({ path: '/' }): 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。
(4)next(error): (2.4.0+) 如果传入 next 的参数是一个 Error 实例,则导航会被终止且该错误会被传递给 router.onError() 注册过的回调。
看下项目中是如何使用的:
const router = new Router({
routes: [{
path: "/",
name: "login",
component: login
},
{
...
}
})
router.beforeEach((to, from, next) => {
const cookieData = getCookie("SignInstate"); // cookie赋值给变量, 判断登录否true/false
if (to.name === "login") {
if (cookieData === "true") { // true 表示登录
// 普通判断是否登录
const TOKEN = JSON.parse(localStorage.dcaw_token); // 获取本地存储的登录信息
if (TOKEN.role === "admin" || TOKEN.role === "teacher") { // TOKEN.role 表示登录用户类别
next({
path: "/Teacher/experimentManage"
});
} else if (TOKEN.role === "student") {
next({
path: "/Student/practice"
});
}
} else {
next();
}
}
}