1.全局前置守卫beforEach(写在main.js 或router.js添加)
守卫方法接收三个参数:
- to:即将要进入的目标路由对象
- from:当前导航正要离开的路由
- next:执行下一步
const router = new VueRouter({
routes
})
router.beforeEach((to, from, next) => {
// to将要访问的路径
// from代表从哪个路径跳转而来
// next 是一个函数,表示放行
// next() 放行, next('/login')强制跳转
if (to.path === '/login') return next();
const tokenStr = window.sessionStorage.getItem('token'); //判断是否存在token
if (!tokenStr) return next('/login');
next();
});
export default router
注意:
当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。
每个守卫方法接收三个参数:
to: Route
: 即将要进入的目标 路由对象from: Route
: 当前导航正要离开的路由-
next: Function
: 一定要调用该方法来 resolve 这个钩子。执行效果依赖next
方法的调用参数。next()
: 进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是 confirmed (确认的)。next(false)
: 中断当前的导航。如果浏览器的 URL 改变了(可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到from
路由对应的地址。next('/')
或者next({ path: '/' })
: 跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。你可以向next
传递任意位置对象,且允许设置诸如replace: true
、name: 'home'
之类的选项以及任何用在router-link
的to
prop 或router.push
中的选项。next(error)
: (2.4.0+) 如果传入next
的参数是一个Error
实例,则导航会被终止且该错误会被传递给router.onError()
注册过的回调。
确保要调用 next
方法,否则钩子就不会被 resolved。
2.全局后置钩子afterEach
- beforeEach是路由跳转前执行的,afterEach是路由跳转后执行的。
router.afterEach((to,from)=>{
if(to.path === "/news"){
alert("进来news了哦");
}
})
3.路由独享的守卫beforeEnter
- 在路由配置上直接定义 beforeEnter 守卫
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
import Home from '../../view/Home.vue'
import Test from '../../view/Test.vue'
import News from '../../view/News.vue'
export default new Router({
routes: [
{
name:"Home",
path:"/",
component:Home,
},
{
name:"Test",
path:"/test",
component:Test,
beforeEnter(to,from,next){
if(to.path==="/test"){
alert("请登录");
next(false); // 禁止跳转
}else{
next()
}
}
},
{
name:"News",
path:"/news",
component:News
},
{
redirect:"/",
path:"*",
}
],
mode:"history"
})
4.组件内的守卫
- 它是和data,methods平级的。
- to:即将要进入的目标路由;
- from:当前导航正要离开的路由,from.name 是路由的名称,对应路由配置中的 name;
- next:一个用来 resolve 当前钩子的方法,需要调用该方法来确认或者中断导航;
beforeRouteLeave(to, from, next) {
// 在渲染该组件的对应路由被 confirm 前调用
// 不!能!获取组件实例 `this`
// 因为当守卫执行前,组件实例还没被创建
next()
},
beforeRouteEnter(to, from, next) {
// 在当前路由改变,但是该组件被复用时调用
// 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
// 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
// 可以访问组件实例 `this`
next()
},
beforeRouteUpdate(to, from, next) {
// 导航离开该组件的对应路由时调用
// 可以访问组件实例 `this`
next()
},
data:{},
method: {}