vue3中路由权限

文章展示了如何在Vue3应用中实现前端路由的权限守卫,确保未登录用户不能访问特定页面,并介绍了如何设置Axios的请求和响应拦截器,用于处理请求头中的token以及错误处理。同时,文章还演示了动态渲染菜单侧边栏的递归组件实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、vue3-前端路由守卫(不登陆不可访问)

// 前置路由守卫
router.beforeEach((to, from, next) => {
  const isLogin = localStorage.getItem('token')
  if (to.meta.requiresAuth && !isLogin) {
    next('/')
  } else {
    next()
  }
})

2、vue3-axios请求拦截器(使用时,引入到文件中即可)

import axios from 'axios';

let app = axios.create({
    baseURL: 'http://127.0.0.1:3000',
    timeout: 10000,
});
// 添加请求拦截器
app.interceptors.request.use(
    function (config) {
        // 在发送请求之前做些什么
        let token = window.localStorage.getItem('token');
        if (token) {
            config.headers.Authorization = token;
            
        }
        return config;
    },
    function (error) {
        // 对请求错误做些什么
        return Promise.reject(error);
    },
);

// 添加响应拦截器
app.interceptors.response.use(
    function (response) {
        // 2xx 范围内的状态码都会触发该函数。
        // 对响应数据做点什么
        return response;
    },
    function (error) {
        // 超出 2xx 范围的状态码都会触发该函数。
        // 对响应错误做点什么
        return Promise.reject(error);
    },
);
export default app;

3、菜单侧边栏渲染

<!-- 父组件 -->
<el-menu
   unique-opened
   router
   :default-active="act_menu"
   class="el-menu-vertical-demo"
   @select="xuan">
       <template v-for="one in menus.menulist" :key="one._id">
         <MenuItem :item="one"> </MenuItem>   // 子组件
       </template>
</el-menu>

<!-- import MenuItem from "../components/menuItem.vue"; -->

<!-- 子组件内容(递归写法) -->

<template>
    <el-menu-item v-if="item.children==undefined || item.children.length === 0" :index="item.powerUrl">
        {{ item.powerName }}
    </el-menu-item>
    <el-sub-menu v-else :index="item._id">
        <template #title>{{ item.powerName }}</template>
        <MenuVue v-for="it in item.children" :key="it._id" :item="it"></MenuVue>
    </el-sub-menu>
</template>

<script setup>
import MenuVue from './menuItem.vue'
import { defineProps } from 'vue';
const props = defineProps({
    item: {
        type: Object
    }
});

</script>

<style scoped></style>

<think>好的,我现在需要为用户介绍Vue中的路由。首先,我得回忆一下Vue Router的基本概念和作用。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。单页面应用的特点是用户在不重新加载页面的情况下切换视图,这就需要前端路由来管理不同的URL和组件的映射关系。 接下来,我应该分步骤来组织内容,确保结构清晰。首先,需要解释为什么需要路由,然后介绍Vue Router的核心概念,比如路由配置、动态路由、嵌套路由、导航守卫等。同时,还要提到一些常用的功能,比如编程式导航、路由参数传递以及懒加载优化。 用户可能对基本用法比较感兴趣,所以我应该从安装和基本配置开始。例如,通过npm安装Vue Router,然后在主文件中引入并使用它。给出一个简单的路由配置示例,展示如何将路径映射到组件。此外,需要说明如何在Vue组件中使用`<router-link>`和`<router-view>`来实现导航和视图渲染。 动态路由匹配也是一个重要部分。需要解释如何通过冒号(:)来定义动态路径参数,例如`/user/:id`,并如何在组件中通过`$route.params.id`来获取参数。可能还需要提到响应路由参数变化的问题,以及使用watch或导航守卫来处理参数变化的情况。 嵌套路由的使用场景和配置方法也需要说明。比如,在用户界面中,可能有侧边栏和主要内容区域,这时候可以通过嵌套路由来组织子组件。给出一个嵌套路由的配置示例,展示children属性的用法。 导航守卫部分比较复杂,但很重要。需要介绍全局前置守卫、路由独享守卫和组件内守卫的不同用途,比如权限验证、页面标题修改等。举例说明如何使用`router.beforeEach`来检查用户是否登录,如果没有则重定向到登录页面。 编程式导航也是一个常用功能,比如在方法中使用`this.$router.push`来跳转页面,这比声明式的`<router-link>`更灵活。需要对比这两种方式的适用场景,并给出代码示例。 另外,路由的懒加载对于性能优化很关键,尤其是在大型应用中。需要解释如何通过动态import语法来实现按需加载组件,减少初始加载时间。 最后,可以简要提及路由的模式,比如hash模式和history模式的区别,以及如何根据服务器配置选择合适的模式。可能还需要提到在部署时如何处理history模式的服务器配置问题,避免出现404错误。 在整理这些内容时,要确保术语准确,示例代码正确,并且符合用户的实际使用场景。同时,要避免过于深入高级主题,保持介绍的基础性和实用性。如果用户有进一步的问题,可以再深入展开某个具体部分。现在,把这些点组织成一个结构清晰的回答,分点介绍,帮助用户逐步理解Vue Router的核心概念和用法。</think>### Vue 路由Vue Router)介绍 Vue Router 是 Vue.js 官方的**路由管理库**,用于构建**单页面应用(SPA)**。它通过 URL 与组件的动态映射,实现页面无刷新切换,同时支持嵌套路由、导航守卫、懒加载等特性。 --- #### 一、核心概念 1. **路由配置** - 定义路径(`path`)与组件(`component`)的映射关系。 - 示例: ```javascript const routes = [ { path: &#39;/&#39;, component: Home }, { path: &#39;/about&#39;, component: About } ]; ``` 2. **动态路由** - 通过冒号 `:` 匹配动态参数: ```javascript { path: &#39;/user/:id&#39;, component: User } ``` - 组件内获取参数: ```javascript this.$route.params.id // 如获取 /user/123 中的 123 ``` 3. **嵌套路由** - 使用 `children` 配置子路由,父组件需包含 `<router-view>`: ```javascript { path: &#39;/parent&#39;, component: Parent, children: [ { path: &#39;child&#39;, component: Child } ] } ``` --- #### 二、核心功能 1. **导航方式** - **声明式导航**:通过 `<router-link>` 生成链接: ```html <router-link to="/about">关于</router-link> ``` - **编程式导航**:通过 `router.push` 跳转: ```javascript this.$router.push(&#39;/about&#39;); ``` 2. **导航守卫** - 控制路由跳转逻辑: - **全局守卫**:`router.beforeEach`(权限验证) - **路由独享守卫**:`beforeEnter` - **组件内守卫**:`beforeRouteEnter` ```javascript router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !isLoggedIn) next(&#39;/login&#39;); else next(); }); ``` 3. **路由懒加载** - 优化性能,按需加载组件: ```javascript const User = () => import(&#39;./User.vue&#39;); ``` --- #### 三、基础使用步骤 1. **安装** ```bash npm install vue-router@4 ``` 2. **初始化路由** ```javascript import { createRouter, createWebHistory } from &#39;vue-router&#39;; const router = createRouter({ history: createWebHistory(), routes // 传入定义的路由配置 }); ``` 3. **挂载到Vue实例** ```javascript const app = createApp(App); app.use(router); app.mount(&#39;#app&#39;); ``` 4. **在组件中使用** ```html <!-- 导航 --> <router-link to="/">首页</router-link> <!-- 路由出口 --> <router-view></router-view> ``` --- #### 四、路由模式 1. **Hash模式** - URL 带 `#`,兼容性好(默认模式): ```javascript createWebHashHistory() ``` 2. **History模式** - 需要服务器支持(如Nginx配置): ```javascript createWebHistory() ``` --- #### 五、常见场景 1. **页面权限控制** 通过导航守卫拦截未登录用户: ```javascript router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !auth.isLoggedIn()) next(&#39;/login&#39;); else next(); }); ``` 2. **路由传参** - 通过 `params`: ```javascript this.$router.push({ name: &#39;user&#39;, params: { id: 1 } }); ``` - 通过 `query`: ```javascript this.$router.push({ path: &#39;/user&#39;, query: { id: 1 } }); ``` --- #### 总结 Vue Router 通过管理 URL 与组件的映射,为 SPA 提供完整的路由解决方案。掌握路由配置、导航守卫、懒加载等核心功能,能够高效实现页面跳转、权限控制及性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值