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)' 来跳转到不同的地址。
    }
  }
}
相关推荐
Q_970956391 分钟前
java+vue+SpringBoo校园失物招领网站(程序+数据库+报告+部署教程+答辩指导)
java·数据库·vue.js
爱分享的程序员15 分钟前
前端面试专栏-算法篇:18. 查找算法(二分查找、哈希查找)
前端·javascript·node.js
翻滚吧键盘20 分钟前
vue 条件渲染(v-if v-else-if v-else v-show)
前端·javascript·vue.js
vim怎么退出22 分钟前
万字长文带你了解微前端架构
前端·微服务·前端框架
你这个年龄怎么睡得着的22 分钟前
为什么 JavaScript 中 'str' 不是对象,却能调用方法?
前端·javascript·面试
Java水解25 分钟前
前端常用单位em/px/rem/vh/vm到底有什么区别?
前端
CAD老兵28 分钟前
Vite 如何借助 esbuild 实现极速 Dev Server 体验,并支持无 source map 的源码调试
前端
南屿im29 分钟前
JavaScript 手写实现防抖与节流:优化高频事件处理的利器
前端·javascript
Spider_Man29 分钟前
从零开始构建React天气应用:API集成与UI设计全指南 🌤️
前端·react.js
浩浩测试一下44 分钟前
渗透信息收集- Web应用漏洞与指纹信息收集以及情报收集
android·前端·安全·web安全·网络安全·安全架构