面试题:Vue Router 完整的导航解析过程是怎样的?

Vue Router 的导航解析过程是指从触发导航到完成页面更新的整个流程。这个过程包括多个步骤,涉及路由守卫、异步组件加载、视图更新等。以下是 Vue Router 完整的导航解析过程:


1. 导航触发

导航可以通过以下方式触发:

  • 调用 router.pushrouter.replacerouter.go
  • 点击 <router-link>
  • 直接在浏览器地址栏输入 URL。

2. 调用全局前置守卫(beforeEach

在导航触发后,Vue Router 会调用全局前置守卫 beforeEach。开发者可以在这里进行权限校验、登录状态检查等操作。

示例

router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next('/login'); // 重定向到登录页
  } else {
    next(); // 继续导航
  }
});

说明

  • to:目标路由对象。
  • from:当前路由对象。
  • next:回调函数,用于继续导航或中断导航。

3. 调用组件内的守卫

如果目标路由的组件定义了路由守卫,Vue Router 会依次调用这些守卫:

  • beforeRouteUpdate(在复用组件时调用)。
  • beforeRouteEnter(在进入组件前调用)。
  • beforeRouteLeave(在离开组件前调用)。

示例

export default {
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被确认前调用
    next(vm => {
      // 通过 `vm` 访问组件实例
    });
  },
  beforeRouteLeave(to, from, next) {
    // 在离开当前路由时调用
    next();
  },
};

4. 解析异步组件

如果目标路由的组件是异步加载的(如使用 import() 动态导入),Vue Router 会等待组件加载完成。

示例

const Foo = () => import('./Foo.vue');

说明

  • Vue Router 会等待异步组件加载完成后再继续导航。

5. 调用全局解析守卫(beforeResolve

在所有组件内守卫和异步组件加载完成后,Vue Router 会调用全局解析守卫 beforeResolve

示例

router.beforeResolve((to, from, next) => {
  // 在导航被确认之前调用
  next();
});

说明

  • 这个钩子适合用于获取数据或执行其他需要在导航确认前完成的操作。

6. 导航确认

在所有的守卫都通过后,Vue Router 会确认导航,并更新 URL。


7. 调用全局后置钩子(afterEach

导航确认后,Vue Router 会调用全局后置钩子 afterEach。这个钩子没有 next 参数,也不会影响导航。

示例

router.afterEach((to, from) => {
  // 导航完成后调用
  console.log('导航完成');
});

8. 更新视图

Vue Router 会根据新的路由匹配结果,更新视图并渲染对应的组件。


9. 触发组件生命周期钩子

在视图更新后,Vue Router 会触发组件的生命周期钩子:

  • 如果组件是复用的,会调用 beforeRouteUpdate
  • 如果组件是新创建的,会调用 beforeRouteEntercreatedmounted 等钩子。

10. 完成导航

导航完成后,页面会根据新的路由状态进行渲染,用户可以看到更新后的内容。


完整的导航解析流程

  1. 导航触发。
  2. 调用全局前置守卫 beforeEach
  3. 调用组件内的守卫(beforeRouteLeavebeforeRouteUpdatebeforeRouteEnter)。
  4. 解析异步组件。
  5. 调用全局解析守卫 beforeResolve
  6. 导航确认。
  7. 调用全局后置钩子 afterEach
  8. 更新视图。
  9. 触发组件生命周期钩子。
  10. 完成导航。

示例代码

以下是一个完整的导航解析示例:

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: () => import('./Foo.vue'),
      meta: { requiresAuth: true },
    },
    {
      path: '/login',
      component: () => import('./Login.vue'),
    },
  ],
});

router.beforeEach((to, from, next) => {
  if (to.meta.requiresAuth && !isAuthenticated()) {
    next('/login');
  } else {
    next();
  }
});

router.beforeResolve((to, from, next) => {
  console.log('beforeResolve');
  next();
});

router.afterEach((to, from) => {
  console.log('afterEach');
});

new Vue({
  router,
}).$mount('#app');

总结

Vue Router 的导航解析过程包括多个步骤,涉及全局守卫、组件内守卫、异步组件加载、视图更新等。通过理解这个流程,可以更好地控制导航行为,实现权限校验、数据预取等功能。

THE END
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容