Vue前端路由详解——以Ruoyi框架为案例学习

news2024/11/13 15:18:48

Vue路由

Vue路由详解_vue 页面路由-CSDN博客

路由模式

Vue 的路由模式:hash 模式和 history 模式的区别_vue路由history和hash的区别-CSDN博客

  1. URL格式
    • Hash模式:URL中包含#号,用于区分页面部分,实际请求的页面地址并没有改变。
    • History模式:URL看起来更加自然,像是普通的页面跳转,不包含#号。
  2. 兼容性
    • Hash模式:在所有浏览器中都能正常工作,包括老旧浏览器。
    • History模式:需要浏览器支持HTML5 History API,因此可能在一些旧版浏览器中无法使用。
  3. 对SEO的影响
    • Hash模式:由于搜索引擎不会解析#后面的内容,因此在SEO方面存在一定的问题。
    • History模式:搜索引擎能够直接解析路由路径,有利于SEO。
  4. 用户体验
    • Hash模式:URL中包含#号,可能影响用户体验和美观性。
    • History模式:URL更加美观,符合用户的直觉和期望。
  5. 刷新页面
    • Hash模式:刷新页面时,由于URL的hash部分不会向服务器发送请求,因此不会出现404错误。
    • History模式:刷新页面时,如果服务器未正确配置,浏览器会向服务器发送请求,如果服务器没有正确处理,将导致404错误。
  6. 服务器配置
    • Hash模式:无需对服务器进行特殊配置。
    • History模式:需要服务器配置支持,确保对所有前端路由的URL都能返回相同的页面(通常是index.html),以便前端路由接管后续的URL处理。
  7. 工作原理
    • Hash模式:通过监听URL的hash变化来实现路由跳转,不向服务器发送请求。
    • History模式:使用HTML5 History API(如pushState和replaceState)来修改浏览器历史记录,从而实现URL的跳转,但同样不向服务器发送请求。这种模式充分利用了浏览器的历史记录功能,实现了无刷新的页面跳转。

Vue路由的动态传参、前置后置路由以及路由组件传参详解

一、Vue路由的动态传参

Vue路由的动态传参主要通过两种方式实现:params方式和query方式

  1. params方式(动态路由匹配)

    • 定义路由:在路由配置中,可以使用:来定义动态片段。例如,{ path: '/user/:id', component: User }。这里的:id就是一个动态片段,它表示/user/后面可以跟随任意字符,这些字符会被捕获并作为$route.params的一部分。
    • 传参:通过<router-link>to属性或编程式导航(如this.$router.push)来传递参数。如果是<router-link>则需要在to对象中指定nameparams(注意,这里的params不会出现在URL中,且仅当路由是通过name进行匹配时有效)。如果是编程式导航,则可以通过pathparams(通常结合router.addRoutes动态添加路由时使用,或者在某些特定场景下,如嵌套路由)。
    • 接收参数:在目标组件中,可以通过this.$route.params来访问传递的参数。
  2. query方式

    • 定义路由:与params方式不同,使用query方式传参时,路由定义与普通路由无异,不需要特殊标记。
    • 传参:通过<router-link>to属性或编程式导航(如this.$router.push)来传递参数。在to对象中,使用query属性来定义要传递的参数。这些参数会出现在URL的查询字符串部分(即?后面的部分)
    • 接收参数:在目标组件中,可以通过this.$route.query来访问传递的参数。
二、前置路由守卫(前置钩子)

Vue Router 提供了导航守卫(Navigation Guards),允许你在路由跳转前后执行特定的逻辑。前置路由守卫(也称为全局前置守卫或路由独享守卫)是最常用的一种。

  • 全局前置守卫:可以通过router.beforeEach注册一个全局前置守卫。这个守卫会在路由即将改变前被调用,你可以在这里执行权限校验、页面跳转前的数据请求等操作。
  • 路由独享守卫:在单个路由配置中,可以直接定义beforeEnter守卫。这个守卫仅在该路由被访问时触发。
  • 组件内的守卫:组件内还可以定义beforeRouteEnterbeforeRouteUpdate(2.2+)和beforeRouteLeave守卫。这些守卫允许你在组件的不同生命周期阶段执行路由相关的逻辑。
三、路由组件传参

路由组件传参通常不是指通过路由本身传递参数给组件,而是指在组件之间通过路由进行跳转时,如何传递数据给目标组件。这实际上与路由的动态传参(params和query)紧密相关。

然而,Vue Router 还提供了一种特殊的方式,即props属性,它允许你将路由参数($route.params$route.query)映射为组件的props。这样,组件就可以像接收普通props一样接收路由传递的数据,而无需手动从$route对象中解构数据。

  • 使用props属性:在路由配置中,为组件设置props属性为true或对象/函数,即可将路由参数映射为组件的props。
    • props: true:将$route.params中的所有参数映射为组件的props。
    • props: { // 对象 }:允许你将路由参数映射为指定的props名。
    • props: (route) => ({ // 函数 }):允许你编写一个函数来返回应该被映射为props的对象。这个函数接收当前路由作为参数。

综上所述,Vue路由的动态传参、前置后置路由以及路由组件传参是Vue Router中非常强大的功能,它们为单页面应用(SPA)中的页面导航和数据传递提供了灵活而强大的支持。

 Ruoyi框架前端路由

Ruoyi框架是一个基于Vue.js和Spring Boot的开源企业级快速开发平台,它提供了一套完整的前后端分离的解决方案。在前端部分,Ruoyi框架主要使用了Vue.js作为前端框架,并通过Vue Router实现路由管理。以下是对Ruoyi框架前端路由的详细解析:

一、路由配置

在Ruoyi框架中,路由配置主要通过@/router/index.js文件进行管理。这个文件是Vue Router的入口文件,负责定义和配置所有的路由规则。

  1. 静态路由
    • 静态路由是指在路由配置阶段就确定好的路由规则,它们的路径和组件都是在编译时确定的,并且不需要动态判断权限的路由,如登录页、404页面等。
    • index.js文件中,静态路由通常被定义为一个常量数组constantRoutes,并在创建Vue Router实例时作为routes选项传入。
    • 静态路由的配置示例(简化版):
const constantRoutes = [ 
{ path: '/login', component: () => import('@/views/login/index'), hidden: true }, 
{ path: '/404', component: () => import('@/views/error-page/404'), hidden: true }, 
// 其他静态路由... 
]; 


const router = new VueRouter({ 
mode: 'history', 
base: process.env.BASE_URL, 
routes: constantRoutes 
});
  1. 动态路由
    • 动态路由是指在运行时根据某些条件动态添加或修改的路由规则,通常用于需要根据用户权限或其他条件动态生成路由规则的场景,如权限管理系统。
    • 在Ruoyi框架中,动态路由的配置通常放在@/store/modules/permission.js文件中,通过调用后端接口获取路由配置信息,并使用router.addRoutes方法动态添加到路由表中。
    • 动态路由的配置示例(简化版):
router.addRoutes(asyncRoutes);

二、路由守卫

Ruoyi框架在前端路由中使用了Vue Router提供的路由守卫功能,以实现权限控制、页面跳转前的数据请求等需求。

  1. 全局前置守卫
    • 通过router.beforeEach注册的全局前置守卫,可以在路由即将改变前执行特定的逻辑,如权限校验、页面跳转前的数据请求等。
    • 示例代码(简化版):
router.beforeEach((to, from, next) => { 
// 权限校验逻辑 
if (to.meta.roles && !store.getters.roles.includes(to.meta.roles[0])) { 
next({ path: '/404', replace: true }); 
} else { 
next(); 
} 
});
  1. 路由独享守卫组件内的守卫
    • 除了全局前置守卫外,Ruoyi框架还可能使用路由独享守卫(beforeEnter)和组件内的守卫(beforeRouteEnterbeforeRouteUpdatebeforeRouteLeave)来实现更细粒度的控制。

三、路由懒加载

为了提高应用的加载速度和性能,Ruoyi框架在路由配置中使用了路由懒加载技术。通过动态导入(import())组件的方式,可以实现按需加载,即只有在访问到某个路由时,才会加载对应的组件代码。

四、路由元信息(meta)

在Ruoyi框架中,路由配置中的meta字段通常用于存储一些自定义的信息,如路由的权限要求、是否缓存、是否显示在侧边栏等。这些信息可以在路由守卫、组件内部等地方被访问和使用。

五、总结

Ruoyi框架前端路由通过Vue Router实现,支持静态路由和动态路由的配置,通过路由守卫实现权限控制等需求,采用路由懒加载提高应用性能,并通过路由元信息存储自定义信息。这些特性共同构成了Ruoyi框架前端路由的完整体系,为开发者提供了灵活、强大的路由管理能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2101953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenCV下的无标定校正(stereoRectifyUncalibrated)

OpenCV下的无标定校正(stereoRectifyUncalibrated) 文章目录 1. 杂话2. 无标定校正2.1 先看代码2.2 一点解释2.3 findFundamentalMat参数2.4 stereoRectifyUncalibrated参数 3. 矫正结果 1. 杂话 咱们在之前的帖子里面讲了一些比较常规的标定和校正OpenCV下的单目标定&#xff…

Unity数据持久化 之 文件操作(增删查改)

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正​​ 这里需要弄清几个概念&#xff1a; File&#xff1a;提供文件操作的静态方法&#xff0c;是管理的 Windows.File -…

除浮毛用吸尘器有用吗?除浮毛真正有用浮毛空气净化器总结

我的医生朋友经常给朋友们讲解宠物毛发对呼吸道的潜在影响&#xff0c;这引起了不同的反应。有人采纳了他的建议&#xff0c;采取了防护措施&#xff1b;而有人则认为他在制造恐慌&#xff0c;特别是当听到宠物医生的说法与之相左时。 我曾也心存疑虑&#xff0c;但经过与朋友…

做开发一年多了,分享一下自己的疑惑以及大模型给我的一些建议~

写在最前面,下面的疑问是我自己的一些困惑和想知道背后的答案,回答这块是大模型的一些建议,我觉得对我来说不能说很对,至少给我了启发和思考,分享出来给大家,大家如果也有类似的疑惑,希望能提供到帮助 原先Java生态是出现各种复杂的业务场景,需要使用合理且合适的技术架…

house of cat

文章目录 house of cat概述&#xff1a;_IO_wfile_jumps进入_IO_wfile_seekoffFSOP__malloc_assert 例题&#xff1a;思路&#xff1a;分析&#xff1a;利用&#xff1a; house of cat 概述&#xff1a; house of cat主要的摸底还是覆盖vtable指针&#xff0c;因为在glibc-2.2…

结构型设计模式—桥接模式

结构型设计模式—桥接模式 欢迎长按图片加好友&#xff0c;我会第一时间和你分享持续更多的开发知识&#xff0c;面试资源&#xff0c;学习方法等等。 假设你要买一张新桌子&#xff0c;你有两个选择&#xff1a;一种是木制的桌子&#xff0c;另一种是金属制的桌子。 无论你选…

软件工程知识点总结(1):软件工程概述

1 什么是软件&#xff1f; 定义&#xff1a;计算机系统中的程序及其文档。 ——程序是计算机任务的处理对象和处理规模的描述&#xff1b; ——文档是为了便于了解程序所需要的阐明性资料。 2 软件的特点&#xff1f; 软件是无形的&#xff0c;不可见的逻辑实体 ——它的正确与…

【Python基础】字典类型

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、Python 字典类型2.1 访问字典里的值2.2 修改字典2.3 删除字典元素2.4 字典键值的特性2.5 遍历字典…

免费pdf转word软件,为你整理出8种方法,总有一个适合你

在日常办公和学习中&#xff0c;PDF文档因其格式稳定、不易修改的特性而广受欢迎。然而&#xff0c;有时我们需要对PDF内容进行编辑或格式调整&#xff0c;这时将其转换为Word文档便显得尤为重要。下面给大家介绍8种将PDF转换成Word的方法&#xff0c;包括在线网站、专业软件及…

第四篇——数学思维:数学家如何从逻辑出发想问题?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学思维中的很多方法能够让我们脱离事物的表象去直击本质通过本质进行逻…

在Linux中使用MySQL基础SQL语句及校验规则

卸载内置环境 查看是否存在MySQL ps axj | grep mysql关闭MySQL systemctl stop mysqld MySQL对应的安装文件 rpm -qa | grep mysql 批量卸载 rpm -qa | grep mysql | xargs yum -y remove 上传MySQL rz 查看本地yum源 ls /etc/yum.repos.d/ -a 安装MySQL rpm -ivh…

Linux:手搓shell

之前学了一些和进程有关的特性&#xff0c;什么进程控制啊进程替换啊&#xff0c;我们来尝试自己搓一个shell()吧 首先我们观察shell的界面&#xff0c;发现centos的界面上有命令提示符&#xff1a; [主机名用户名当前路径] 我们可以通过调用系统函数获取当前路径&#xff0…

C语言代码练习(第十二天)

今日练习&#xff1a; 28、&#xff08;指针&#xff09;将字符串 a 复制为字符串 b &#xff0c;然后输出字符串 b 29、改变指针变量的值 30、输入两个整数&#xff0c;然后让用户选择1或者2&#xff0c;选择1是调用 max &#xff0c;输出两者中的大数&#xff0c;选择2是调用…

Mac M1 安装Hadoop教程(安装包安装)

一、引言 前面一期&#xff0c;我分享了通过homebrew方式安装Hadoop&#xff0c;本期我将通过安装包方式介绍下hadoop如何安装。二、下载open jdk8 官方下载地址 注意如果是x86架构的苹果电脑&#xff0c;Architecture选择x86 64-bit或者 x86-32bit。 下载后&#xff0c;将得…

Axios前后端对接

前端&#xff1a; 通过GET获取元素&#xff1a; console.log(res),接收接口返回的数据并打印出来。 async:是异步的知识。 通过POST修改&#xff0c;更新元素&#xff1a; 后端&#xff1a; 通过前端从后端获取一个对象&#xff1a; 后端执行相应方法&#xff1a; 然后获取L…

Spring6学习笔记2:容器IoC

文章目录 3 容器&#xff1a;IoC3.1 IoC容器3.1.2 依赖注入3.1.3 IoC容器在Spring的实现 3.2 基于XML管理Bean3.2.1 搭建子模块spring6-ioc-xml3.2.2 实验一&#xff1a;获取bean①方式一&#xff1a;根据id获取②方式二&#xff1a;根据类型获取③方式三&#xff1a;根据id和类…

day-48 一个小组的最大实力值

思路 想把所有非零数相乘&#xff0c;再统计负数的个数&#xff0c;如果负数为奇数个&#xff0c;则把乘机除以最大的那个负数即为答案&#xff0c;如果为偶数个&#xff0c;那么乘机即为答案 解题过程 但要考虑特殊情况&#xff1a;1.只有零和一个负数&#xff0c;返回零 2.全…

深入浅出Stream流

Java 8的新特性之一就是流stream&#xff0c;配合同版本出现的 Lambda &#xff0c;使得操作集合&#xff08;Collection&#xff09;提供了极大的便利。 案例引入 在JAVA中&#xff0c;涉及到对数组、Collection等集合类中的元素进行操作的时候&#xff0c;通常会通过循环的…

cuda编程[1]:一二三维网格和块的核函数

目录 前言核函数一维二维三维结果分析 前言 所有的代码下载链接&#xff1a;code。以下代码展示了如何在 CUDA 中打印网格和线程的索引信息。代码包括一维、二维和三维的网格和块的设置&#xff0c;并定义了多个内核函数来输出当前的索引信息。 核函数 打印线程索引 __gl…

七、场景加载

一、新的场景加载方法 Unity在2023更新的一个方法 1、引用命名空间 2、调用代码 传入加载场景SO 注&#xff1a;此方法是 await 方法名 步骤&#xff1a;var s获取返回值&#xff1b;await返回加载内容&#xff1b;if(判断一下) 此时运行会出现&#xff1a;未卸载当前地图…