>  기사  >  웹 프론트엔드  >  Vue-Router의 탐색 후크에 대한 심층 분석

Vue-Router의 탐색 후크에 대한 심층 분석

青灯夜游
青灯夜游앞으로
2021-11-08 18:55:392186검색

이 기사는 인터뷰에서 꼭 물어봐야 할 사항에 대해 설명합니다. Vue-Router의 탐색 후크가 도움이 되기를 바랍니다.

Vue-Router의 탐색 후크에 대한 심층 분석

Navigation Guard

"Navigation"은 경로가 변경되고 있음을 나타냅니다.

vue-router vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。【相关推荐:《vue.js教程》】

1.全局前置守卫----router.beforeEach

router.beforeEach 注册一个全局前置守卫:

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  //  to:要去哪个页面
  //  from:从哪里来
  //  next:它是一个函数。
  //     如果直接放行 next()
  //     如果要跳到其它页 next(其它页)
})

示例代码:

router.beforeEach(async(to, from, next) => {
  NProgress.start() // 开启进度条
  const token = store.state.user.token
  const userId = store.state.user.userInfo.userId
  console.log(token, to.path, from.path)
  if (token) {
    if (to.path === '/login') { // 有 token还要去login
      next('/')
      NProgress.done() // 关闭进度条
    } else { // 有 token,去其他页面,放行
      if (!userId) {
        await store.dispatch('user/getUserInfo')
      }
      next()
    }
  } else {
    if (to.path === '/login') { // 没有token,去login,放行
      next()
    } else {
      next('/login') // 没有token,去其他页面
      NProgress.done()
    }
  }
})

小结

  • router.beforeEach(回调(三个参数))
  • 导航守卫函数中,一定要调用next( )
  • to.path: to是一个路由对象,path表示路径,是它的一个属性

2. 全局后置钩子----router.afterEach

router.afterEach 注册一个全局后置钩子:

你也可以注册全局后置钩子,然而和守卫不同的是,这些钩子不会接受 next 函数也不会改变导航本身:

router.afterEach((to, from) => {
  // ...
})

3. 全局解析守卫----router.beforeResolve

在 2.5.0+ 你可以用 router.beforeResolve 注册一个全局守卫。这和 router.beforeEach 类似,区别是在导航被确认之前,同时在所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。

4.路由独享的守卫

你可以在路由配置上直接定义 beforeEnter 守卫:

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

5.组件内的守卫

  • beforeRouteEnter
  • beforeRouteUpdate (2.2 新增)
  • beforeRouteLeave
const Foo = {
  template: `...`,
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate(to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave(to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}

完整的导航解析流程

  • 导航被触发。

  • 在失活的组件里调用 beforeRouteLeave 守卫。

  • 调用全局的 beforeEach 守卫。

  • 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。

  • 在路由配置里调用 beforeEnter

  • 解析异步路由组件。

  • 在被激活的组件里调用 beforeRouteEnter

  • 调用全局的 beforeResolve 守卫 (2.5+)。

  • 导航被确认。

  • 调用全局的 afterEach 钩子。

  • 触发 DOM 更新。

  • 调用 beforeRouteEnter 守卫中传给 next제공되는 내비게이션 가드는 주로 점프나 취소로 내비게이션을 보호하는 데 사용됩니다. 경로 탐색 프로세스를 구축할 수 있는 기회는 여러 가지가 있습니다. 전역적으로, 단일 경로에 대해 단독으로 또는 구성 요소 수준에서 말이죠.

    【관련 추천: "vue.js 튜토리얼
  • "]

1. 글로벌 프론트 가드----router.beforeEach

router.beforeEach🎜 글로벌 프론트 가드 등록: 🎜rrreee🎜샘플 코드: 🎜rrreee

🎜Summary🎜

  • router.beforeEach (콜백 (🎜세 개의 매개변수🎜))🎜
  • 내비게이션 가드 기능에서는 반드시 next( )를 호출하세요 🎜
  • to.path: to는 라우팅 객체이고, path는 경로를 나타내며 그 속성입니다🎜🎜

    🎜2. afterEach🎜

    🎜🎜router.afterEach🎜 전역 포스트 후크 등록: 🎜🎜 전역 포스트 후크도 등록할 수 있지만 가드와 달리 이러한 후크는 next 함수는 탐색 자체를 변경하지 않습니다: 🎜rrreee

    🎜3. 2.5의 전역 해상도 가드----router.beforeResolve🎜

    🎜. 0+ router.beforeResolve를 사용하여 글로벌 가드를 등록할 수 있습니다. 이는 router.beforeEach와 유사합니다. 차이점은 탐색이 확인되기 전에 가드가 모든 구성 요소에 동시에 있고 비동기 라우팅 구성 요소가 구문 분석된 후에 구문 분석 가드가 호출된다는 것입니다. 🎜

    🎜4. 경로 전용 가드 🎜

    🎜 경로 구성에서 beforeEnter 가드를 직접 정의할 수 있습니다: 🎜rrreee

    🎜5. 구성 요소 내의 가드🎜

    • beforeRouteEnter🎜
    • beforeRouteUpdate(2.2 신규 추가 )🎜
    • beforeRouteLeave🎜🎜rrreee

      🎜탐색 분석 프로세스 완료🎜

      • 🎜내비게이션이 실행됩니다. 🎜🎜
      • 🎜비활성화된 구성요소에서 beforeRouteLeave 가드를 호출하세요. 🎜🎜
      • 🎜전역 beforeEach 가드를 호출하세요. 🎜🎜
      • 🎜재사용된 구성요소에서 beforeRouteUpdate 가드(2.2+)를 호출하세요. 🎜🎜
      • 🎜라우팅 구성에서 beforeEnter를 호출하세요. 🎜🎜
      • 🎜비동기 라우팅 구성 요소를 해결합니다. 🎜🎜
      • 🎜활성화된 구성요소에서 beforeRouteEnter를 호출하세요. 🎜🎜
      • 🎜전역 beforeResolve 가드(2.5+)를 호출합니다. 🎜🎜
      • 🎜내비게이션이 확인되었습니다. 🎜🎜
      • 🎜전역 afterEach 후크를 호출하세요. 🎜🎜
      • 🎜DOM 업데이트를 트리거합니다. 🎜🎜
      • 🎜beforeRouteEnter 가드에서 next에 전달된 콜백 함수를 호출하면 생성된 구성 요소 인스턴스가 콜백 함수의 매개 변수로 전달됩니다. 🎜🎜🎜🎜더 많은 프로그래밍 관련 지식을 보려면 🎜프로그래밍 소개🎜를 방문하세요! ! 🎜

위 내용은 Vue-Router의 탐색 후크에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제