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)' 来跳转到不同的地址。
    }
  }
}
相关推荐
会篮球的程序猿12 分钟前
原生表格文本过长展示问题,参考layui长文本,点击出现文本域
前端·javascript·layui
top_designer12 分钟前
Firefly 样式参考:AI 驱动的 UI 资产“无限”生成
前端·人工智能·ui·aigc·ux·设计师
蜗牛前端27 分钟前
使用 Trae AI 开发完整的开源 npm 包:snail-git-add
前端
哆啦A梦158844 分钟前
48 我的地址页面布局
javascript·vue.js·node.js
Dontla1 小时前
React useMemo(当依赖项未变化,重复渲染时直接返回上一次缓存计算结果,而非重新执行计算)
前端·react.js·缓存
花生Peadar1 小时前
AI编程从入门到精通
前端·后端·代码规范
bug爱好者1 小时前
vue3.x 使用vue3-tree-org实现组织架构图 + 自定义模版内容 - 附完整示例
前端·javascript·vue.js
flashlight_hi1 小时前
LeetCode 分类刷题:1669. 合并两个链表
javascript·leetcode·链表
达达尼昂1 小时前
🎯 Flutter 拖拽选择组件:flutter_drag_selector —— 像选文件一样选择列表项
前端·flutter
Keely402851 小时前
Claude 配置使用墨刀MCP(modao-proto-mcp)
前端·aigc·claude