vue router 的导航守卫

157 阅读3分钟

写在前面

Vue Router 提供了多种导航守卫(Navigation Guards),用于在路由跳转前后执行一些逻辑。这些守卫可以帮助你控制用户的导航行为,例如验证用户权限、加载数据等。下面针对 Vue Router 导航守卫的使用做一下介绍。

全局守卫

全局守卫在所有路由跳转前后生效。Vue Router 提供了以下几种全局守卫:

  • beforeEach:在路由跳转之前调用。
  • beforeResolve:在路由跳转解析完成之后,但在导航确认之前调用。
  • afterEach:在路由跳转完成后调用。
import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';

const routes = [
  {
    path: '/',
    component: Home,
    beforeEnter: (to, from, next) => {
      console.log('Home 路由独享守卫', to, from);
      // 进行特定于 Home 路由的操作
      next();
    },
  },
  {
    path: '/about',
    component: About,
    beforeEnter: (to, from, next) => {
      console.log('About 路由独享守卫', to, from);
      // 进行特定于 About 路由的操作
      next();
    },
  },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

单个路由独享的守卫

你可以在路由配置中为特定路由定义独享的守卫。这些守卫仅在该路由跳转前后生效。


import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';

const routes = [
  {
    path: '/',
    component: Home,
    beforeEnter: (to, from, next) => {
      console.log('Home 路由独享守卫', to, from);
      // 进行特定于 Home 路由的操作
      next();
    },
  },
  {
    path: '/about',
    component: About,
    beforeEnter: (to, from, next) => {
      console.log('About 路由独享守卫', to, from);
      // 进行特定于 About 路由的操作
      next();
    },
  },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

export default router;

组件内的守卫

你可以在组件内定义守卫,这些守卫仅在该组件的路由跳转前后生效。Vue Router 提供了以下几种组件内守卫:

  • beforeRouteEnter:在路由进入前调用。
  • beforeRouteUpdate:在路由参数变化时调用。
  • beforeRouteLeave:在路由离开前调用。
<template>
  <div>
    <h1>About Page</h1>
  </div>
</template>

<script>
export default {
  name: 'About',
  beforeRouteEnter(to, from, next) {
    console.log('About 组件内前置守卫', to, from);
    // 进行特定于 About 组件的操作
    next();
  },
  beforeRouteUpdate(to, from, next) {
    console.log('About 组件内更新守卫', to, from);
    // 处理路由参数变化
    next();
  },
  beforeRouteLeave(to, from, next) {
    console.log('About 组件内离开守卫', to, from);
    // 确认用户是否要离开
    const answer = window.confirm('Do you really want to leave? you have unsaved changes!');
    if (answer) {
      next();
    } else {
      next(false);
    }
  },
};
</script>

<style scoped></style>

总结

全局守卫

  • beforeEach:在每次路由跳转之前调用,可以用于权限验证、用户登录状态检查等。
  • beforeResolve:在路由跳转解析完成之后,但在导航确认之前调用,可以用于数据预加载。
  • afterEach:在每次路由跳转完成后调用,可以用于页面标题设置、日志记录等。

单个路由独享的守卫

  • beforeEnter:在特定路由跳转前后生效,可以用于特定路由的权限验证或数据加载。

组件内的守卫

  • beforeRouteEnter:在组件实例被创建之前调用,不能访问 this,但可以通过 next(vm => {}) 访问组件实例。
  • beforeRouteUpdate:在路由参数变化时调用,可以用于处理动态路由参数的变化。
  • beforeRouteLeave:在路由离开前调用,可以用于确认用户是否要离开当前页面。

通过使用 Vue Router 的导航守卫,你可以在路由跳转前后执行各种逻辑,从而更好地控制用户的导航行为。这些守卫提供了强大的灵活性和控制能力,帮助你构建更复杂和功能丰富的应用。

参考

mp.weixin.qq.com/s/-O0Ncsiu7…