路由拦截
导航守卫
全局前置守卫
可以在路由跳转时对所有的路由进行拦截,拦截后根据条件对路由进行next() 或者next到其他路由操作
const router = new VueRouter()
router.beforeEach((to, from, next) => {
// to表示要去的路由地址
// from表示来自哪个路由地址
// next可以进行路由跳转
})
路由拦截后的判断
const routes = [
{
path: '/',
meta: {
requiredAuth: true
}
}
]
const router = new VueRouter()
router.beforeEach((to, from, next) => {
// 判断当前路由以及路由的父路由中是否包含meta,meta里是否有requiredAuth
// to.matched中包含当前路由以及父路由
// 如果判断出to.matched中某个路由里有meta.requiredAuth
if (to.matched.some(route => route.meta.requiredAuth)) {
// 判断是否已经登录
if (已登录) {
next()
} else {
// 那就跳转到登录 并且添加query参数returnurl为to.path
next({
path: '/login',
query: {
returnurl: to.path // 从哪来回哪去
}
})
}
} else {
next()
}
})
登录组件的处理
<template>
<div>
<button @click="login">登录</button>
</div>
</template>
<script>
export default {
methods: {
login () {
// 调用结构
login(user, password).then(res => {
// 将结果中的验证信息存储到localStorage中
// 成功则跳转到对应的来时的页面
const url = this.$route.query.returnurl || '/'
this.$router.push(url)
})
}
}
}
</script>