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实现一个简单的路由守卫的主要内容。

相关文章
|
3月前
|
资源调度 JavaScript 前端开发
路由管理:Vue Router的使用和配置技巧
【10月更文挑战第21天】路由管理:Vue Router的使用和配置技巧
64 3
|
3月前
|
JavaScript API
vue 批量自动引入并注册组件或路由等等
【10月更文挑战第12天】 vue 批量自动引入并注册组件或路由等等
|
3月前
|
JavaScript 前端开发 API
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
vue3中常用插件的使用方法:按需引入自定义组件,自动导入依赖包,自动生成路由,自动生成模拟数据
1058 0
|
3月前
|
JavaScript 前端开发 UED
vue中vue-router路由懒加载(按需加载)的作用以及常见的实现方法
vue中vue-router路由懒加载(按需加载)的作用以及常见的实现方法
258 1
|
4月前
|
JavaScript
vue项目中使用vue-router进行路由配置及嵌套多级路由
该文章详细说明了如何在Vue项目中配置和使用vue-router进行单页面应用的路由管理,包括设置嵌套路由和实现多级路由导航的示例。
|
3月前
vue3 + Ts 中 使用 class 封装 axios
【10月更文挑战第8天】
219 1
|
3月前
|
JavaScript 前端开发 UED
|
3月前
vue3 + Ts 中 使用 class 封装 axios
【10月更文挑战第5天】
261 1
|
3月前
|
JavaScript 前端开发 API
前端技术分享:Vue.js 动态路由与守卫
【10月更文挑战第1天】前端技术分享:Vue.js 动态路由与守卫
|
3月前
|
资源调度 JavaScript UED
如何使用Vue.js实现单页应用的路由功能
【10月更文挑战第1天】如何使用Vue.js实现单页应用的路由功能

热门文章

最新文章

  • 1
    JavaScript 使用axios库发送 post请求给后端, 给定base64格式的字符串数据和一些其他参数, 使用表单方式提交, 并使用onUploadProgress显示进度
    532
  • 2
    若依修改,若依如何发送请求---王清江07,axios的请求在request.js文件中,若依发送GET请求,必须用param
    227
  • 3
    axios发送post请求,如何接受和返回一个axios的字段,解决bug的方法,困难的事情先从简单做起,先从发送一个axios的post请求做起,解决方法查别人的资料,查看F12看network就行
    52
  • 4
    文本,前后端数据交互,简单请求,如何去给data数据赋值,在mounted()里赋值,利用axios发送的请求,res就是数据集,就是后端的数据,this.users = res.data.data
    52
  • 5
    Request failed with status code 400,使用axios.post要发送参数,认真比对原项目,看看有没有忘记什么?
    122
  • 6
    vue3 在 watchEffect 里中断未完成的 axios 请求(只保留最后一次请求的方法---连续点击查询按钮的优化)
    152
  • 7
    前后端数据交互.js文件的axios的写法,想要往后端发送数据,页面注入API,await的意思是同步等待服务器数据,并返回,axios注入在其他页面,其他页面调用的时候,同步作用
    60
  • 8
    前后端数据交互,API风格组合式API和选项式API,setup是一个标识,组合式编写的意思,使定义count.value的值自增的写法,组合式API使用axios的写法,ref定义响应数据写法
    38
  • 9
    网页设计,若依项目修改(It must be done)02------axios封装后发get请求,axios请求的位置在呢?
    54
  • 10
    前后端数据交互之axios的路径怎样找?axios的路径是那个,是你打开Tomcat之后,出现的路径+你项目写的接口路径
    52