导航守卫
导航守卫包括全局守卫、路由独享守卫和组件内守卫,可以在路由导航过程中的不同阶段。其中每一个导航守卫都有两个参数to
和from
。
其中全局守卫包括全局前置守卫、全局解析守卫和全局后置钩子。全局前置守卫是当一个导航触发时,可以按照创建的顺序进行调用。而且守卫是可以异步解析执行。如果导航所有守卫没有完成解析之前会一直处于挂起状态。全局前置守卫的注册使用router.beforeEach()
方法。如果取消导航,设置返回值为false
,如果想要路由重定向到另一个位置,可以返回一个路由位置对象。调用的方法和路由调用push方法一样。传递接收的值可以是字符串或者布尔值。返回路由对象位置时,会删除当前的导航,并且使用相同的from
去创建一个新的导航。当出现其他情况时,可能也会抛出一个错误为Error
对象。这时候会调用onError()
注册的任何回调而且会取消导航。我们需要注意的是如果没有任何返回值和undefined
或者true
时,就会验证导航并且调用下一个导航守卫。全局解析守卫使用的是beforeResolve()
进行注册,解析守卫这个方法和路由的beforeEach()
方法很像。但是不同的是,解析守卫被调用是在导航被确认之前,所有的路由内守卫和异步路由组件被解析之后。
router.beforeEach(async (to, from) => {
return await taeZss(to)
})
全局后置钩子是使用afterEach()
进行注册,调用是在导航被确认之后。它和守卫不同的是,全局后置钩子不接受可选的next()
函数,也不会去改变导航。在全局后置钩子中还可以接收另一个参数,用来表示导航失败的failure
参数,用来作为第三个参数。而且全局后置钩子在很多情况下很有用,例如分析或者更改页面标题以及发布页面时。我们在定义路由时,routes
的配置中每个路由对象中都可以拥有一个meta
字段,这个字段是用来给路由提供一个元数据信息。该字段可以设置页面的标题。meta
字段还可以用来对资源的保护,需要添加一个验证属性requireAuth
,,在全局前置守卫中进行判断,如果访问的是保护的资源,就判断用户是否已经登录,如果登录则可以访问。如果没有登录则跳转到登录页面。