Skip to content

路由守卫 #95

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Twlig opened this issue Apr 13, 2022 · 0 comments
Open

路由守卫 #95

Twlig opened this issue Apr 13, 2022 · 0 comments
Labels

Comments

@Twlig
Copy link
Owner

Twlig commented Apr 13, 2022

导航守卫就是路由跳转过程中的一些钩子函数。vue-router提供的导航守卫主要用来通过跳转或取消的方式守卫导航。

路由守卫分类

全局守卫:是指路由实例上直接操作的钩子函数,特点是所有路由配置的组件都会触发,直白点就是触发路由就会触发这些钩子函数

  • beforeEach(to,from, next)

    全局前置守卫。

  • beforeResolve(to,from, next)

    全局解析守卫,在所有组件内守卫和异步路由组件被解析之后,解析守卫就被正确调用。

  • afterEach(to,from)

    全局后置钩子。此时路由已经发生转换,因此,该函数不会接受 next 函数也不会改变导航本身。

路由守卫: 是指在单个路由配置的时候也可以设置的钩子函数

  • beforeEnter(to,from, next)

    只在进入路由时触发,不会在 params、query 或 hash 改变时触发。例如,从 /users/2 进入到 /users/3 或者从 /users/2#info 进入到 /users/2#projects。它们只有在 从一个不同的 路由导航时,才会被触发。

组件守卫:是指在组件内执行的钩子函数,类似于组件内的生命周期,相当于为配置路由的组件添加的生命周期钩子函数。

  • beforeRouteEnter(to,from, next)

    在渲染该组件的对应路由被验证前调用,不能获取组件实例 this , 因为当守卫执行时,组件实例还没被创建!

  • beforeRouteUpdate(to,from, next)

    在当前路由改变,但是该组件被复用时调用。举例来说,对于一个带有动态参数的路径 /users/:id,在 /users/1/users/2 之间跳转的时候。

  • beforeRouteLeave(to,from, next)

    在导航离开渲染该组件的对应路由时调用。

路由守卫回调参数介绍

  • to:即将要进入的目标路由对象;
  • from:即将要离开的路由对象;
  • next:涉及到next参数的钩子函数,必须调用next()方法来resolve这个钩子,否则路由会中断在这,不会继续往下执行
    • next():进行管道中的下一个钩子。如果全部钩子执行完了,则导航的状态就是confirmed(确认的)。
    • next( false )中断当前的导航。如果浏览器的 URL 改变了 (可能是用户手动或者浏览器后退按钮),那么 URL 地址会重置到from路由对应的地址。
    • next( ' / ')或者next({ paht:' / ' }):跳转到一个不同的地址。当前的导航被中断,然后进行一个新的导航。可传递的参数可以是router-link标签中的to属性参数或router.push中的选项
    • next( error ):如果传入next的参数是一个Error实例,则导航会被终止且该错误会被传递给router.onError()注册过的回调。

完整导航流程

  1. 导航被触发。
  2. 在失活的组件里调用 beforeRouteLeave 守卫。
  3. 调用全局的 beforeEach 守卫。
  4. 在重用的组件里调用 beforeRouteUpdate 守卫(2.2+)。
  5. 在路由配置里调用 beforeEnter
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter
  8. 调用全局的 beforeResolve 守卫(2.5+)。
  9. 导航被确认。
  10. 调用全局的 afterEach 钩子。
  11. 触发 DOM 更新。
  12. 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。

原文连接:

@Twlig Twlig added the Vue label Apr 13, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant