router.beforeEach的用法简单介绍

本文详细介绍了在Vue项目中如何使用router.beforeEach进行页面跳转前的登录状态检查。通过判断store中的loginInfo.loginState来决定是否允许用户访问需要权限的页面,若未登录则重定向至登录页,并在登录成功后返回原目标页面。

router.beforeEach一般在main.js里面使用:
这里做补充说明下两个参数,
to: 下一个页面/即将要进入的目标
form: 当前页面

//这里是main.js里面
router.beforeEach((to, from, next) => {

  var channel = utils.getUrlParam('channel', from.fullPath) || ''
  if (channel) {
    localStorage.setItem('channel', channel)
  }

  if (wanka.isWanka()) {
    // 万卡app直接跳转
    next()
  } else {
    if (to.meta.requireAuth) {      //判断是否要登录才能打开页面
      if (store.state.loginInfo.loginState) {    //有登录状态,直接跳转
        next()
      } else {
        next({
          path: '/user/login',                //无登录状态,先跳转到登录页面
          query: { redirected: to.fullPath } // 登录成功后跳转回到该路由
        })
      }
    } else {
      next()
    }
  }
})

原文:https://www.jianshu.com/p/d8a2f3ce3132

### Vue Router 中 `beforeEach` 和 `afterEach` 的使用方法 #### 全局前置守卫 `beforeEach` `beforeEach` 是一个全局前置守卫,在每次路由跳转之前都会触发。它可以用来执行一些逻辑,比如权限校验、加载动画启动等。 以下是其基本语法和功能说明: ```javascript const router = new VueRouter({ // 配置选项... }); router.beforeEach((to, from, next) => { // to: 即将要进入的目标路由对象 // from: 当前导航正要离开的路由对象 // next: 必须调用该函数来 resolve 这个钩子 if (to.meta.requiresAuth && !isAuthenticated()) { // 如果目标路由需要认证而用户未登录,则重定向到登录页 return next('/login'); } next(); // 放行导航 }); ``` 上述代码展示了如何在导航至受保护的路由时检查用户的认证状态[^1]。如果没有通过认证,则会阻止导航并重定向到登录页面。 --- #### 全局后置守卫 `afterEach` `afterEach` 是一个全局后置守卫,在每次路由跳转完成之后触发。它通常用于记录日志、更改页面标题或其他不需要中断导航的操作。 以下是其基本语法和功能说明: ```javascript router.afterEach((to, from, failure) => { // to: 已经进入的目标路由对象 // from: 刚刚离开的路由对象 // failure: 如果导航失败则为错误对象;否则为 undefined document.title = to.meta.title || '默认标题'; // 动态设置页面标题 if (failure) { console.error('Navigation failed:', failure); } }); ``` 此代码片段演示了如何利用 `afterEach` 修改页面标题以及处理可能发生的导航失败情况[^3]。 --- #### 综合示例 下面是一个完整的综合示例,展示如何同时使用 `beforeEach` 和 `afterEach` 来实现更复杂的业务需求: ```javascript // 定义路由器实例 const router = new VueRouter({ routes: [ { path: '/', component: Home }, { path: '/about', component: About, meta: { title: '关于' } }, { path: '/dashboard', component: Dashboard, meta: { requiresAuth: true, title: '仪表盘' } }, ], }); // 前置守卫:检查用户是否已登录 router.beforeEach((to, from, next) => { if (to.matched.some(record => record.meta.requiresAuth)) { if (!isLoggedIn()) { return next({ path: '/login', query: { redirect: to.fullPath } }); } } next(); }); // 后置守卫:动态调整页面标题 router.afterEach((to, from, failure) => { if (!failure) { document.title = to.meta.title || '默认应用名称'; } }); ``` 在此例子中,`beforeEach` 负责拦截那些需要身份验证的路由请求,并引导未授权用户前往登录界面;而 `afterEach` 则负责依据当前路由元信息中的 `title` 属性更新网页标签的内容。 --- ### 总结 - **`beforeEach`**: 主要在导航开始前运行,适合做权限检测或初始化工作。 - **`afterEach`**: 在导航结束后运行,适用于无条件的日志记录或 UI 更新操作。 两者配合可以有效增强应用程序的功能性和用户体验。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值