pinia+axios+vue3实现路由守卫

简介: pinia+axios+vue3实现路由守卫

pinia+axios+vue3实现路由守卫

为什么需要路由守卫

在实际开发中,我们会遇到这样一个常见的需求:某些页面只允许登录后查看,如果未登录,则跳转到登录页面。或许是有些页面有权限的需求。

而这时,我们就需要使用到路由守卫。

在本篇文章中,我们使用pinia作为我们的状态管理库,路由使用vue-router4,vue版本为3.2。

状态管理文件

在store文件中我们应该注意以下的几个操作:

  • state中声明属性的默认值
  • actions中声明我们store的方法,在authToken方法中我们、调用了封装的axiosGet函数,这个函数用来调用axios的get方法(本篇文章使用的函数可以在这里找到:vue3+TypeScript使用二次封装的axiosAPI - 掘金 (juejin.cn))。
  • axiosGet的then方法中我们改变属性的值。

文件位置:

|-- src

    |-- store

          |-- index.ts

index.ts

import { defineStore } from "pinia";
import { axiosGet } from "../axios/api";
import { User } from "../Interface/Interface";

export const useStore = defineStore("main", {
  state: () => {
    return {
      ifPassAuth: false,
      userData: {} as User,
    };
  },
  actions: {
    // 验证Token,返回userData
    async authToken() {
      await axiosGet("api/users")
        .then((res) => {
          this.userData = res.data;
          this.ifPassAuth = true;
        })
    },
    // ...
  },
});

在我们声明的store中,我们有一个验证是否登录的函数authToken,。

路由文件

关于路由守卫,在router文件中我们应该注意以下的几个操作:

  • 在路由对象中声明meta属性的值,meta属性是一个对象,它的作用是我们能通过meta对象中的一些属性来判断当前路由是否需要进一步处理
  • 我们通过router.beforeEach方法来实现路由守卫,它的参数是一个回调函数。这个回调函数的参数为to,from,next,分别为要跳转的路由对象,跳转前的原路由对象,next跳转函数。
  • 我们通过if-else来判断to.meta是否有我们想要判断的属性,next()为跳转原目标路由,可以传参,类似于router.push方法。
|-- src

    |-- router

          |-- index.ts

index.ts

import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router";
import { useStore } from "../store";

const routes: Array<RouteRecordRaw> = [
//...
  {
    name: "Index",
    path: "/",
    component: () => import(`@comps/Index/Index.vue`),
  },
  // 添加文章
  {
    name: "AddArticle",
    path: "/addarticle",
    component: () => import(`../components/xxxxx/xxxxxxx.vue`),
    meta: {
      isLogin: true,
    },
  },
  // 所有评论
  {
    name: "AllComment",
    path: "/article/content/:articleId/all-comment",
    component: () => import(`../components/xxx/xxxx.vue`),
    meta: {
      isLogin: true,
    },
  },
  // 管理员页面
  {
    name: "Admin",
    path: "/xxx/xxxxxx",
    component: () => import(`../components/xxx/xxxx.vue`),
    meta: {
      isAdmin: true,
    },
  },
  //...
];

const router = createRouter({
  linkActiveClass: "routerLinkActive",
  history: createWebHistory(),
  routes,
});

router.beforeEach((to, from, next) => {
  // next();
  if (to.meta.isAdmin) {
    if (useStore().userData.role === "root") {
      next();
    } else {
      next({ name: "Index" });
    }
  } else if (to.meta.isLogin) {
    if (useStore().ifPassAuth) {
      next();
      // console.log(useStore().ifPassAuth);
    } else {
      next({ name: "Login" });
    }
  } else {
    next();
  }
});

router.afterEach((to, from, next) => {
  // 跳转后滚动条在顶部
  window.scrollTo(0, 0);
});

export default router;

主函数文件

由于我们需要在router主函数执行前执行我们的authToken方法,所以我们可以封装一个beforeAppMount函数,来执行根组件挂载前的需要执行的函数。

我们可以看到,store.authToken();app.use(router)先执行,所以我们的router中拿到的userDataifPassAuth是验证后的值。

main.ts

import { createApp } from "vue";
import "./index.css";
import App from "./App.vue";
import router from "./router";
import { createPinia } from "pinia";
import { useStore } from "./store";
//...

const app = createApp(App);
//...

const beforeAppMount = async () => {
  app.use(createPinia());
  const store = useStore();
  await store.authToken();
};

beforeAppMount().then(() => {
  app.use(router).mount("#app");
});

以上就是使用pinia+vue3+axios+vue-router实现一个简单的路由守卫的主要内容。

相关文章
|
18天前
|
JavaScript
【vue】如何跳转路由到指定页面位置
【vue】如何跳转路由到指定页面位置
19 0
|
1月前
|
JSON 前端开发 JavaScript
Vue3 Ajax(axios)
Vue3 Ajax(axios)
|
1月前
|
JavaScript
vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)
vue路由导航守卫(全局守卫、路由独享守卫、组件内守卫)
41 0
|
20天前
|
资源调度 JavaScript 前端开发
Vue的路由管理:VueRouter的配置和使用
【4月更文挑战第24天】VueRouter是Vue.js的官方路由管理器,用于在单页面应用中管理URL路径与组件的映射。通过安装并引入VueRouter,设置路由规则和创建router实例,可以实现不同路径下显示不同组件。主要组件包括:`&lt;router-link&gt;`用于创建导航链接,`&lt;router-view&gt;`负责渲染当前路由对应的组件。此外,VueRouter还支持编程式导航和各种高级特性,如嵌套路由、路由参数和守卫,以应对复杂路由场景。
|
17天前
|
JavaScript 数据可视化 算法
vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)
vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)
36 6
|
4天前
|
JavaScript
vue中watch监听路由传来的参数变化问题
vue中watch监听路由传来的参数变化问题
5 0
|
5天前
|
前端开发 JavaScript 数据格式
vue3中axios添加请求和响应的拦截器
vue3中axios添加请求和响应的拦截器
11 1
|
6天前
|
缓存 JavaScript
在 Vue 组件中使用计算属性和侦听器来响应路由变化
Vue Router 中,计算属性和侦听器常用于根据路由变化更新组件状态。计算属性缓存依赖,当路由参数改变时自动更新,如示例中的 `userId`。侦听器则监听 `$route` 变化,执行相应操作,例如在 `currentUserId` 示例中响应 `userId` 更新。计算属性适合简单变化,而异步操作或复杂场景可选用侦听器。Vue 3 中,`watchEffect` 减少了部分侦听场景的复杂性。总之,它们用于组件内部响应路由变化,而非直接处理路由逻辑。
12 4
|
14天前
|
资源调度 JavaScript 前端开发
【vue】vue中的路由vue-router,vue-cli脚手架详细使用教程
【vue】vue中的路由vue-router,vue-cli脚手架详细使用教程
|
14天前
|
JavaScript Go
Vue路由跳转及路由传参
Vue路由跳转及路由传参