vue-router全局路由守卫的使用

本文介绍了在Vue Router v4和v3版本中如何使用全局路由守卫进行登录状态和权限检查。在用户未登录时,重定向至登录页面;未授权时,跳转至无权限页面。通过`beforeEach`导航守卫,检查本地存储的用户信息,实现动态路由控制。

全局路由守卫使用场景:控制页面登录,权限控制。

  • 当用户未登录的情况下,都是跳转登录页面;
  • 当用户没有权限时,进入无权限页面;

vue-router v4.版本

详细查看官网:https://router.vuejs.org/zh/guide/advanced/navigation-guards.html

import { createRouter, createWebHashHistory, RouteRecordRaw } from "vue-router";
import HomeView from "../views/HomeView.vue";

const routes: Array<RouteRecordRaw> = [
  {
    path: "/home",
    name: "home",
    component: HomeView,
  },
  {
    path: "/about",
    name: "about",
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () =>
      import(/* webpackChunkName: "about" */ "../views/AboutView.vue"),
  },
  {
    path: "/login",
    name: "login",
    component: () => import("../views/LoginPage.vue"),
  },
];

const router = createRouter({
  history: createWebHashHistory(),
  routes,
});

router.beforeEach((to, form, next) => {
  console.log("beforeEach", to, form);
  const obj = sessionStorage.getItem("userInfo") || "{ }";
  const userInfo = JSON.parse(obj);

  // 判断是否登录
  if (Object.keys(userInfo).length) {
    console.log("go");
    next();
  } else {
    if (to.fullPath === "/login") {
      next();
    } else {
      next("/login");
    }
  }
});

export default router;


vue-router v3.版本

详细查询官网:https://v3.router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%89%8D%E7%BD%AE%E5%AE%88%E5%8D%AB

import Vue from "vue";
import Router from "vue-router";
import Home from "./views/Home.vue";

import { Role_List } from "./common/constant";
Vue.use(Router);

const router = new Router({
  routes: [
    {
      path: "/",
      name: "home",
      component: Home,
      meta: {
        role: []
      }
    }
  ]
});

router.beforeEach((to, form, next) => {
  const userInfo = localStorage.getItem("userInfo") || {};
  const routerRoleList = to.meta.role || []; //当前路由具有权限角色list
  if (typeof userInfo.roleId === "number") {
    //当前角色信息
    const currentRoleObj = Role_List.filter(v => v.value === userInfo.roleId)[0];

    if (routerRoleList.includes(userInfo.roleId)) {
      next();
    } else {
      const defaultPath = currentRoleObj.defaultPath;
      next(defaultPath);
    }
  } else {
    //用户接口获取失败时重定向home页
    if (["/"].includes(to.fullPath)) {
      next();
    } else {
      next("/");
    }
  }

  
});
export default router;

### Vue Router 4.4.5 中路由守卫的使用指南 Vue Router 4 是基于 Vue 3 构建的新一代路由库,其设计更加现代化且灵活。以下是关于 Vue Router 4.4.5 中全局、单个路由以及组件内的路由守卫的具体说明。 #### 全局路由守卫Vue Router 4 中,可以通过 `router` 实例来定义全局前置守卫 (`beforeEach`)、后置钩子 (`afterEach`) 和解析守卫 (`beforeResolve`)。这些守卫可以用来控制导航行为或执行一些逻辑操作。 ```javascript import { createRouter, createWebHistory } from 'vue-router'; const router = createRouter({ history: createWebHistory(), routes: [ { path: '/home', component: () => import('@/views/Home.vue'), }, { path: '/about', component: () => import('@/views/About.vue'), }, ], }); // 全局前置守卫 beforeEach router.beforeEach((to, from) => { console.log('Navigating from', from.path, 'to', to.path); // 可在此处实现权限校验或其他逻辑 return true; // 返回 true 表示允许继续导航 }); // 全局后置钩子 afterEach router.afterEach((to, from) => { console.log('Navigation completed:', from.path, '->', to.path); }); export default router; ``` 以上代码展示了如何通过 `beforeEach` 定义一个简单的全局前置守卫[^1]。它会在每次导航之前触发,并接收两个参数:目标路由对象 `to` 和当前路由对象 `from`。 --- #### 单个路由独享守卫 对于某些特定的路由,可以在定义路由时为其指定单独的守卫函数。这种情况下,守卫只会影响该路由及其嵌套路由的行为。 ```javascript { path: '/admin', component: Admin, beforeEnter: (to, from) => { const isAuthenticated = checkAuth(); // 假设有一个认证检查函数 if (!isAuthenticated) { alert('You do not have permission!'); return '/'; } return true; }, }, ``` 上述代码片段中,`beforeEnter` 守卫仅应用于 `/admin` 路径下的所有导航请求[^2]。如果用户未通过身份验证,则会重定向到根路径。 --- #### 组件内部守卫 除了全局和局部守卫外,还可以利用组件中的生命周期方法作为更细粒度的控制手段。常见的有: - **`beforeRouteLeave`**: 当离开当前组件对应的路由时调用。 - **`beforeRouteUpdate`**: 如果在同一组件内切换不同的动态参数(例如 `/user/:id`),则此钩子会被激活。 - **`asyncData`**: 不属于标准 API,但在实际应用中常被封装成类似的模式以便于数据预取。 下面是一个完整的例子演示如何在一个视图组件里声明这些选项: ```javascript <script> export default { name: 'UserProfile', async beforeRouteEnter(to, from, next) { try { const userData = await fetchUserData(to.params.id); // 获取用户资料 next(vm => vm.setData(userData)); // 将获取的数据传递给实例 } catch (error) { next(false); // 错误处理,阻止进一步跳转 } }, methods: { setData(data) { this.user = data; }, }, }; </script> <template> <div v-if="user"> <h1>{{ user.name }}</h1> <!-- 更多模板内容 --> </div> </template> ``` 这里需要注意的是,在进入阶段无法访问组件实例,所以需要借助回调形式完成初始化工作[^3]。 --- ### 总结 综上所述,Vue Router 提供了多种方式让我们能够优雅地管理复杂的业务场景需求。无论是整体性的策略还是针对具体页面的功能增强都可以轻松达成目的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值