vue3角色路由封装

在市面上很多网站都是左侧菜单栏+左侧内容页的样式,同时具有很多个角色,只是左边菜单栏显示的内容不一致罢了,有些人会单独写俩个页面来显示不同的角色,但是这样页面复用性不高,这个时候我们就需要动态路由(有些系统的路由是由后端返回,有些的是由前端提前记录好,本篇讲述的是前端记录好,但是其实后端返回概念是一样的就是需要在返回的结果中获取路由信息而已)

一般公共的路由我们会先存入到  router  的  routes  里面

比如:

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: [
    {
      path: "/login",
      name: "login",
      component: () => import("@/views/login/index.vue"),
    },
    {
      path: "/register",
      name: "register",
      component: () => import("@/views/register/index.vue"),
    },
    ,
  ],
});

或者是存入到 basicRoute 中:

const basicRouter = [
  {
    path: "/login",
    name: "login",
    component: Login,
  },
  {
    path: "/register",
    name: "register",
    component: Register,
  },
  {
    path: "/forget",
    name: "forget",
    component: ForgetPwd,
  }
];

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  routes: basicRouter,
});

然后一般获取动态路由的操作会在登录成功之后,来执行(我这里存入userStore里面的数据就比较简单了,只有身份和token,现实情况肯定不止我这么点信息的)

const res = await loginInAPI(form.value.account, form.value.password);

  if (res.data.data.success) {
    ElMessage.success("登录成功");

    userStore.setUser(res.data.roles, res.data.token);//身份信息 存储到store中

    setTimeout(() => {
      router.push("/");//登录成功后跳转主页界面
    }, 2000);
  } else {
    ElMessage.error(res.data.data.message);
  }

存储成功之后,他这里做了跳转,到主界面,这个时候我们就需要路由守卫来处理

在   router  文件夹下面的  index.ts 下:

router.beforeEach(async (to, from, next) => {
  // 判断有没有登录
  const userStore = useUserStore();//使用store

  const { isLogin, user } = storeToRefs(userStore);//必须使用这种方式

  if (to.name == "login") {
    next();
    return;
  }


    if (isLogin.value === false) {//如果还没有登录

      const res = await setRouter(user.value.roles);//异步请求方式设置 routes

      isLogin.value = true;//设置是否登录的值

      if (res === true) {
        next('/');
      } else next(false);

      return;
    } 

    next();
  
});

setRouter 方法

export const setRouter = async (roles: string) => {//导出这个函数
  return new Promise((resolve, reject) => {
    

    const myRouter: RouteRecordRaw = getRouter(roles);//获取 routes

    router.addRoute(myRouter);  //添加路由
    
    resolve(true);
  });
};

getRouter 这是在 utils 下面的一个  router.ts 文件  我把路由信息进行了封装放入了进去。需要注意的是  addRoute 时里面的 route 必须是一个对象

import type { RouteRecordRaw } from "vue-router";

const studentRouter: RouteRecordRaw = {};//学生路由

const teacherRouter: RouteRecordRaw = {};//老师路由

export const getRouter = (roles: string): RouteRecordRaw => {
  if (identity === 'student') return studentRouter;
  else return teacherRouter;
};

这样子就实现了大概的逻辑,但是还是会有点问题,因为当你刷新页面的时候,你缓存的这些就没有了,可以借助  store 把路由信息存储在store里面,但是还是需要进行一步操作:

在 main.ts 中需要这样做,在页面进行刷新时,main.ts 的内容也会重新加载

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";

import App from './App.vue'
import router from './router'
import { useUserStore } from './stores/userStore';

// import "./mock/index.ts"; // mock 方式,正式发布时,注释掉该处即可

const app = createApp(App)
const pinia = createPinia();

pinia.use(piniaPluginPersistedstate);
app.use(pinia)

const userStore=useUserStore()
userStore.setRoutes()

这里面的顺序一定不要搞错,一定要是先使用了 pinia 再去使用相关store,userStore.setRoutes()的内容也很简单,调用 router 文件夹下面的 index.ts 中的 setRouter 方法,而且我们在 store 里面使用了 router 里面的函数,位置也必须要在 引入 router 下面使用这个 store

import { ref } from "vue";
import { defineStore } from "pinia";
import { setRouter} from "@/router";

export const useUserStore = defineStore(
  "user",
  () => {
    const user = ref({
      roles: "",
      token: "",
    });

    const setUser = (roles: string, token: string) => {
      user.value.roles = roles;
      user.value.token = token;
    };


    const setRoutes = () => {
      setRouter(user.value.roles);
    };

    return { user, setUser, setRoutes };
  },
  {
    persist: true,
  }
);

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了封装Vue3的路由守卫,你可以按照以下步骤进行操作: 1. 在Vue3项目中引入Vue-router4.0版本。 2. 创建一个新的文件,例如"router.js",用于存放路由相关的代码。 3. 在"router.js"中,使用`createRouter`函数创建一个新的路由实例。 4. 在创建路由实例的过程中,可以定义全局的前置路由守卫和后置路由守卫。可以通过`beforeEach`方法定义前置路由守卫,通过`afterEach`方法定义后置路由守卫。 5. 在前置路由守卫中,可以进行一些验证或权限控制的操作,例如检查用户是否已登录,是否有权限访问某个页面等。 6. 在后置路由守卫中,可以进行一些页面切换后的操作,例如记录页面的访问记录、统计页面的访问量等。 7. 将创建的路由实例导出,在主文件中引入并挂载到Vue实例中。 总结一下,封装Vue3的路由守卫的步骤如下: 1. 引入Vue-router4.0版本。 2. 创建一个新的文件,例如"router.js"。 3. 在"router.js"中创建路由实例,并定义全局的前置路由守卫和后置路由守卫。 4. 导出路由实例。 5. 在主文件中引入并挂载路由实例到Vue实例中。 希望这些步骤可以帮助你封装Vue3的路由守卫。请注意,上述步骤仅供参考,具体的实现方法可能会根据你的项目需求有所不同。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [使用Vue3.0+Element-plus+Vue-router4.0(并对利用导航守卫对路由进行二次封装)搭建后台管理系统项目](https://blog.csdn.net/weixin_43742274/article/details/114701007)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值