一、基础知识
我们用到了导航守卫beforeEach(引自vue的官方文档)。
你可以使用
router.beforeEach
注册一个全局前置守卫:
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
// ...
})
当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于等待中。
每个守卫方法接收三个参数:
-
to: Route
: 即将要进入的目标路由对象 -
from: Route
: 当前导航正要离开的路由 -
next: Function
: 一定要调用该方法来resolve这个钩子。执行效果依赖next
方法的调用参数。-
next()
: 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是confirmed(确认的)。 -
next(false)
: 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到from
路由对应的地址。 -
next('/')
或者next({ path: '/' })
**: 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。 -
next(error)
: (2.4.0+) 如果传入next
的参数是一个Error
实例,则导航会被终止且该错误会被传递给router.onError()
注册过的回调。确保要调用next
方法,否则钩子就不会被 resolved。
-
二、逻辑实现
接下来讲我们的逻辑:
判断下一个页面是否需要登录
如果需要登录:判断是否已登录
如果已登录:访问下一个页面
如果未登录:回到登录界面
如果不需要登录:访问下一个页面
main.js
const router = new VueRouter({store})
router.beforeEach((to, from, next) => {
if (to.meta.requiresAuth) { // 下一个页面需要登录
if(stare.state.bAuth) { // 已登录
next() // 访问下一个页面
} else { // 未登录
next('/') // 回到登录界面
}
} else { //下一个页面不需要登录
next() // 访问下一个页面
}
})
router.js
routes: [
{
path: '/',
name: 'login',
component: login
},
{
path: '/home',
name: 'home',
component: home,
meta: {
requiresAuth: true //需要登陆的标记,那个页面需要登录哪个页面加这个属性(自定义属性)
}
}
]
store.js
state = {
bAuth: true //判断是否已登录的标记
}
login.vue
// 记得引入store
mounted () {
store.state.bAuth = false //每次到登录页面时告诉它没有登录,否则只有第一次登录有效
}
$.ajax({
...
success: function (data) {
store.state.bAuth = true //成功登录,告诉它已登录
}
...
})
网友评论