Vite + Vue3 + TS项目配置前置路由守卫

        在现代前端开发中,使用 Vue 3 TypeScript 的组合是一种流行且高效的开发方式。Vite 是一个极速的构建工具,可以显著提升开发体验。本文博主将指导你如何在 Vite + Vue 3 + TypeScript 项目中配置前置路由守卫(Navigation Guards)。

前置条件

在开始配置项目前置路由守卫前,博主希望你能够先达成以下前置条件:

1.完成Vue3前端项目搭建: Vite 创建 Vue3 + TS 项目

2.引入Vue-Router模块:Vue3项目配置Vue-Router

3.完成Pinia配置:Vue项目安装Pinia

1.创建前置守卫

        在之前的章节中,我们已经完成了路由视图和路由重定向的配置,现在我们只需要为我们的路由器实例对象添加一个导航守卫就可以控制是否放行路由跳转啦。

        我们可以通过 router.beforeEach 注册一个全局前置守卫,当一个导航触发时,全局前置守卫按照创建顺序调用。

        守卫是异步解析执行的,导航在所有守卫 resolve 完之前一直处于等待中

// 路由配置文件 index.ts

import { createWebHistory, createRouter } from 'vue-router'

// 定义路由配置
const routes: Array<any> = [
    {
        path: '/',
        redirect: '/home'
    },
    {
        path: '/login',
        name: 'Login',
        component: () => import('/@/views/login/index.vue')
    },
    {
        path: '/home',
        name: 'Home',
        component: () => import('/@/views/home/index.vue'),
    }
]

// 创建路由实例
const router = createRouter({
    history: createWebHistory(),    // 导航历史记录模式
    routes
})

// 导航守卫
router.beforeEach((to, from) => {
    // 返回 false 以取消导航
    return false
})


// 导出实例
export default router

每个路由守卫都可以有以下三个参数:

  • to:即将要进入的目标;
  • from:当前导航正要离开的路由;
  • next:当你在使用next时,确保 next 在任何给定的导航守卫中都被严格调用一次。它可以出现多于一次,但是只能在所有的逻辑路径都不重叠的情况下,否则钩子永远都不会被解析或报错。

 2.配置无token跳转登录页

        既然知道了 Vue-Router 导航守卫的工作机制,那么我们现在可以尝试一下结合 Pinia 进行路由控制了:

        2.1.配置User状态

        在 src/store/ 目录下,新建 userInfo.ts 文件,用于存储 User/token 等状态:

// userInfo.ts


import { defineStore } from 'pinia'
import { reactive } from 'vue'

interface UserInfo {
    token: string,
    userId: string,
    userName: string,
    roles: Array<string>
}

export const useUserInfoStore = defineStore('userInfo', () => {

    const state = reactive({
        userInfo: {} as UserInfo
    })

    const setUserInfo = (userInfo: UserInfo) => {
        state.userInfo = userInfo
    }

    const getUserInfo = () => {
        return state.userInfo
    }

    return { state, setUserInfo, getUserInfo }
})

        2.2.配置前置路由守卫

        在 router.beforeEach 中根据token配置路由跳转:

// index.ts 路由配置文件

import { createWebHistory, createRouter } from 'vue-router'
// 引入我们刚才写好的 Pinia 状态
import { useUserInfoStore } from '/@/store/userInfo'

// 定义路由配置
const routes: Array<any> = [
    {
        path: '/',
        redirect: '/home'
    },
    {
        path: '/login',
        name: 'Login',
        component: () => import('/@/views/login/index.vue')
    },
    {
        path: '/home',
        name: 'Home',
        component: () => import('/@/views/home/index.vue'),
    }
]

// 创建路由实例
const router = createRouter({
    history: createWebHistory(),    // 导航历史记录模式
    routes
})

// 导航守卫
router.beforeEach((to, from, next) => { 
    const userInfoStore = useUserInfoStore()
    if ((to.path === '/login') && (!userInfoStore.state.userInfo.token)) {
        next()
    } else {
        if (userInfoStore.state.userInfo.token) {
            next()
        } else {
            next('/login')
        }
    }
 })


// 导出实例
export default router

3.效果测试

        项目根路径下(与src目录同级),运行命令行:

# 启动项目
$ npm run dev

        可见,现在我们的pinia中没有存储的有token,所以在项目启动时,被全局前置守卫拦截下来,跳转到登录路由。

### 配置 ViteVue3路由ViteVue3 项目配置路由是一个常见的需求,可以通过 `vue-router` 来实现。以下是详细的说明: #### 1. 安装依赖 首先,在项目根目录下安装 `vue-router`: ```bash npm install vue-router@next ``` #### 2. 创建路由文件 在项目的 `src` 文件夹下创建一个新的文件夹 `router` 并在其内部创建一个名为 `index.js` 或者 `index.ts` 的文件。 以下是一个典型的路由配置示例[^4]: ```javascript // src/router/index.js import { createRouter, createWebHashHistory } from &#39;vue-router&#39;; import Home from &#39;../views/Home.vue&#39;; const routes = [ { path: &#39;/&#39;, redirect: &#39;/home&#39;, }, { path: &#39;/home&#39;, name: &#39;Home&#39;, component: Home, }, ]; const router = createRouter({ history: createWebHashHistory(), routes, }); export default router; ``` #### 3. 在主入口文件引入并挂载路由器 修改 `main.js` 或 `main.ts` 文件来注册路由实例: ```javascript // main.js or main.ts import { createApp } from &#39;vue&#39;; import App from &#39;./App.vue&#39;; import router from &#39;./router&#39;; // 导入路由模块 const app = createApp(App); app.use(router); // 使用路由 app.mount(&#39;#app&#39;); ``` #### 4. 设置路由出口 为了使页面能够渲染对应的组件,需要在 `App.vue` 中定义 `<router-view>` 标签作为路由的占位符[^2][^3]: ```html <!-- App.vue --> <template> <div id="app"> <!-- 路由出口 --> <router-view></router-view> </div> </template> <script setup lang="ts"></script> <style scoped></style> ``` #### 5. 添加路由动画 (可选) 如果希望为路由切换添加过渡效果,则可以在 `App.vue` 中包裹 `<transition>` 组件[^1]: ```html <!-- App.vue --> <template> <div id="app"> <transition name="fade" mode="out-in"> <router-view /> </transition> </div> </template> <script setup lang="ts"></script> <style scoped> /* 动画样式 */ .fade-enter-active, .fade-leave-active { transition: opacity 0.5s ease; } .fade-enter-from, .fade-leave-to { opacity: 0; } </style> ``` #### 6. 实现路由鉴权(前置守卫) 通过 Vue Router 提供的导航守卫功能可以轻松完成权限校验逻辑。下面展示了一个简单的例子用于验证用户登录状态: ```javascript // src/router/index.js router.beforeEach((to, from, next) => { const isAuthenticated = localStorage.getItem(&#39;token&#39;); // 假设 token 存储于本地存储 if (to.name !== &#39;Login&#39; && !isAuthenticated) { return next({ name: &#39;Login&#39; }); // 如果未认证则跳转到登录页 } next(); // 否则继续执行后续操作 }); ``` 以上即完成了基于 ViteVue3 的基础路由配置流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛*璃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值