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)' 来跳转到不同的地址。
    }
  }
}
相关推荐
芭拉拉小魔仙7 分钟前
【Vue3+TypeScript】H5项目实现企业微信OAuth2.0授权登录完整指南
javascript·typescript·企业微信
JosieBook44 分钟前
【SpringBoot】21-Spring Boot中Web页面抽取公共页面的完整实践
前端·spring boot·python
吃饭睡觉打豆豆嘛1 小时前
深入剖析 Promise 实现:从原理到手写完整实现
前端·javascript
前端端2 小时前
claude code 原理分析
前端
GalaxyMeteor2 小时前
Elpis 开发框架搭建第二期 - Webpack5 实现工程化建设
前端
Spider_Man2 小时前
从 “不会迭代” 到 “面试加分”:JS 迭代器现场教学
前端·javascript·面试
我的写法有点潮2 小时前
最全Scss语法,赶紧收藏起来吧
前端·css
小高0072 小时前
🧙‍♂️ 老司机私藏清单:从“记事本”到“旗舰 IDE”,我只装了这 12 个插件
前端·javascript·vue.js
Mo_jon2 小时前
css 遮盖滚动条,鼠标移上显示
前端·css
EveryPossible2 小时前
终止异步操作
前端·javascript·vue.js