Vue 路由守卫

Vue 路由守卫


一、全局路由守卫 router.js

1. 前置守卫

javascript 复制代码
router.beforeEach((to, from, next) => {
  // to: Route 即将要进入的目标 路由对象
  // from: Route 当前导航正要离开的路由
  // next: Function 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
 
  // 例如,验证用户是否已登录
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!auth.isLoggedIn()) {
      next({
        path: '/login',
        query: { redirect: to.fullPath }
      });
    } else {
      next();
    }
  } else {
    next(); // 确保一定要调用 next()
  }
});

2. 后置钩子

javascript 复制代码
router.afterEach((to, from) => {
  // to: Route 即将要进入的目标 路由对象
  // from: Route 当前导航正要离开的路由对象
  // 全局后置钩子,不会接受 next 函数也不会改变导航本身
  if (to.meta.title) {
    document.title = to.meta.title + " - 系统名称"
  }
  console.log('Navigation completed successfully.');
});

二、路由独享的守卫

javascript 复制代码
const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // 参数和全局前置守卫类似
      }
    }
  ]
});

三、组件内的守卫

可以在路由组件内直接定义以下三个路由守卫:

复制代码
beforeRouteEnter
beforeRouteUpdate (2.2+ 支持)
beforeRouteLeave

示例:beforeRouteEnter 守卫

javascript 复制代码
export default {
  name: 'UserProfile',
  beforeRouteEnter(to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不能获取组件实例 `this` 组件实例尚未创建
    next(vm => {
      // 通过 `vm` 访问组件实例
    });
  },
  beforeRouteLeave(to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
    const answer = window.confirm('Do you really want to leave? you have unsaved changes!');
    if (answer) {
      next(); // 确保调用 next() 方法,否则钩子就不会被 resolved。
    } else {
      next(false); // 使用 'next(false)' 来取消导航并停留在当前页面。或者可以使用 'next('/')' 或者 'next(new Location)' 来跳转到不同的地址。
    }
  }
}
相关推荐
Cache技术分享5 小时前
191. Java 异常 - 捕获与处理异常
前端·后端
RoyLin5 小时前
TypeScript设计模式:模板方法模式
前端·后端·node.js
小桥风满袖5 小时前
极简三分钟ES6 - ES9中对象扩展
前端·javascript
云舟吖5 小时前
基于 electron-vite 实现一个 RPA 网页自动化工具
前端·架构
用户9481817675445 小时前
超越NAT:如何构建高效、安全的内网穿透隧道
前端
明天的明5 小时前
vue双向数据绑定失效
前端
bug_kada6 小时前
前端路由:深入理解History模式
前端·面试
LIUENG6 小时前
快速开发一个 VSCode 插件
前端·visual studio code
bug_kada6 小时前
前端路由:Hash vs History,一篇讲明白!
前端·面试
城中的雾6 小时前
HarmonyOS应用拉起系列(三):如何直接拉起腾讯/百度/高德地图进行导航
前端·javascript·harmonyos