导航守卫
场景:当刷新页面时,会使得vuex仓库中的数据归零
概念:当路由发生跳转时,会被导航守卫拦截(自身就是函数),我们就能够在函数中实现自己的业务
分类:
全局守卫
全局前置守卫 (我们讲这个)
全局解析守卫
全局后置钩子
路由独享守卫
组件内守卫
beforeRouteEnter
beforeRouteUpdate
beforeRouteLeave (我们讲这一个)
1 全局前置守卫
位置:路由配置文件
只要路由发生了跳转,都会被拦截
router/index.js
router.beforeEach((to, from,next) => {
//to代表目标路由
//from代表源路由
//next() 代表放行
//next("/....")跳转到某个路由中
})
demo: 如果进入非登录、注册组件则需要判断是否有token,有就放行,没有就滚到登录界面
//全局前置守卫
router.beforeEach((to, from,next) => {
//to代表目标路由
//from代表源路由
console.log(to.path,from.path);
//登录、注册组件直接放行
if(to.path=="/login" || to.path=="/register"){
next();
}else{
//判断是否有token
if(localStorage.token){// localStorage.getItem("token")
next()
}else{
next("/login");
}
}
//next() 代表放行
//next("/....")跳转到某个路由中
})
2 路由独享守卫
位置:路由配置文件
只会影响当前路由
{
path: "stuList",
component: StuList,
meta:{
name:"学生列表",
url:"/main/stuList",
},
beforeEnter: (to, from,next) => {
},
3 组件内守卫 beforeRouteLeave
位置:组件内部
当离开某个组件时被拦截
export default {
beforeRouteLeave(to, from, next){
}
}
demo: 离开组件时,如果文本框中有内容,则提示确认离开吗
beforeRouteLeave(to, from, next){
if(this.t){
//提示框
let flag=confirm("确认离开吗")
if(flag){
next()
}
}else{
next();
}
}