0601概述-react路由-react

news2025/1/16 0:26:59

1 SPA与MPA

1.1 简述

单页面应用和多页面应用是两种不同的 Web 应用程序架构。

单页面应用(SPA)是指在一个 HTML 页面中动态加载和渲染所有的应用程序内容,通过前端 JavaScript 操作来实现页面的变化和交互。SPA 不需要每次请求新的 HTML 页面,因此可以提供更快的响应速度和更好的用户体验,但是需要处理前端路由、状态管理等问题。

多页面应用(MPA)是指每个页面都是一个单独的 HTML 页面,每次点击链接或刷新页面时都会发送一个新的请求并加载新的页面。MPA 在传统的 Web 应用程序中使用较多,它可以很容易地处理 SEO 和页面刷新等问题,但是需要处理页面间的通信、资源重复加载等问题。

单页面应用和多页面应用在设计思路和应用场景上有很大的不同。SPA 更适合于需要提供更好用户体验和更快响应速度的应用程序,例如社交媒体、电子商务、游戏等;而 MPA 更适合于需要搜索引擎优化和静态内容展示的应用程序,例如新闻、博客、官方网站等。

在实际开发中,可以根据具体的应用需求和技术选型来选择合适的应用程序架构,有时候也可以结合两种架构的优点来进行设计和开发。

单页面应用和多页面应用的常见区别:

不同点单页面应用(SPA)多页面应用(MPA)
组成一个主页面和多个页面片段多个主页面
刷新方式局部刷新整页刷新
url模式哈希模式历史模式
SEO搜索引擎优化难实现,可使用SSR方式改善容易实现
数据传递容易通过url、cookie、localStorage等传递
页面切换速度快,用户体验良好切换加载资源,速度慢,用户体验差
维护成本相对容易相对复杂

1.2 SPA

SPA(Single Page Application)单页面应用是一种 Web 应用程序架构,它使用 Ajax 和 HTML5 技术在单个页面上动态加载内容,而不是像传统的 Web 应用程序那样在每次导航时重新加载整个页面。单页面应用程序通常使用前端框架(如 React、Vue.js 或 Angular)和路由库(如 React Router 或 Vue Router)来实现。

在 SPA 单页面应用程序中,所有的页面内容都在一个 HTML 页面中动态加载和渲染,而不是通过浏览器重新加载整个页面。通常,SPA 单页面应用程序会在加载页面时使用 Ajax 请求服务器数据,并使用 JavaScript 动态更新页面内容。这意味着,用户可以在不刷新整个页面的情况下在应用程序中浏览不同的页面或内容。

SPA 单页面应用程序的优点包括:

  • 更好的用户体验:由于无需重新加载整个页面,SPA 单页面应用程序可以更快地响应用户操作,并提供更平滑的导航和交互效果。
  • 更快的加载速度:一旦初始的应用程序代码被加载和渲染,SPA 单页面应用程序可以在后台加载和缓存数据,以减少每个页面的加载时间。
  • 更好的可维护性:由于所有的应用程序逻辑都在前端代码中处理,因此可以更轻松地进行代码维护和部署。

然而,SPA 单页面应用程序也有一些缺点:

  • 首次加载慢:SPA 单页面应用程序通常需要一次性加载大量 JavaScript 代码和其他资源,这可能会导致首次加载时间较长。
  • 对 SEO 不友好:由于 SPA 单页面应用程序只有一个 HTML 页面和一个 URL,搜索引擎可能会难以理解和索引页面的内容,这可能会影响页面的排名和搜索流量。
  • 安全问题:由于所有应用程序代码都在前端执行,因此可能容易受到 XSS(跨站点脚本)攻击和其他安全威胁。

2 路由

2.1 简述

路由是指根据不同的 URL 地址,将不同的请求映射到对应的处理方法或视图,从而实现页面之间的跳转和数据传递。在 Web 应用程序中,路由通常用于控制页面的展示和交互。

在传统的多页面应用中,路由主要用于处理页面的导航和跳转。当用户点击链接或者提交表单时,浏览器会发送一个 HTTP 请求到服务器,服务器返回相应的 HTML 页面,然后浏览器重新加载页面并显示新的内容。在这种情况下,路由是由服务器进行控制的。

在单页面应用(SPA)中,路由主要用于控制页面的变化和交互。由于 SPA 不需要每次加载新的 HTML 页面,因此需要通过前端 JavaScript 操作来实现页面的变化和交互。前端路由会监听 URL 的变化,并根据不同的 URL 地址显示不同的页面内容或组件。在 SPA 中,路由通常是由前端框架(如 React、Vue.js 或 Angular)和路由库(如 React Router 或 Vue Router)来实现的。

Web 应用程序中的路由通常有以下几个组成部分:

  • URL 地址:指用户请求的地址,通常由路径和查询参数组成。
  • 路由规则:指 URL 地址与对应处理方法或视图的映射关系,通常使用路由配置文件或者路由库来进行配置。
  • 处理方法或视图:指处理 URL 地址请求的方法或者需要展示的页面内容,通常是服务器端或客户端的业务逻辑代码。

路由在 Web 应用程序中起到了非常重要的作用,它可以使用户快速地访问页面和数据,并且可以提高 Web 应用程序的用户体验和交互性。同时,路由的实现也是 Web 应用程序开发中的一个重要的技术难点,需要根据应用程序的需求和技术选型进行选择和配置。

2.2 简记

  • 映射:不同的请求(URL)映射到对应的处理方法或视图;

  • 目的:实现页面之间的跳转和数据传递。

  • 组成部分:

    • URL 地址:指用户请求的地址,通常由路径和查询参数组成。
    • 路由规则:指 URL 地址与对应处理方法或视图的映射关系,通常使用路由配置文件或者路由库来进行配置。
    • 处理方法或视图:指处理 URL 地址请求的方法或者需要展示的页面内容,通常是服务器端或客户端的业务逻辑代码。

2.3 分类

路由可以根据不同的分类方式进行分类,常见的分类方式包括以下几种:

  1. 前端路由和后端路由

前端路由是指通过 JavaScript 在客户端实现的路由,常用于单页面应用程序(SPA)中,通过监听 URL 变化来动态渲染页面。后端路由是指通过服务器端的路由规则来处理请求,常用于多页面应用程序(MPA)中,每次请求都会重新加载整个页面。

  1. 静态路由和动态路由

静态路由是指路由规则在应用程序启动时就已经确定,通常包含了固定的 URL 地址和处理方法或视图。动态路由是指路由规则在运行时动态生成,通常包含了可变的 URL 地址和处理方法或视图,例如根据不同的参数或用户权限来动态生成路由规则。

  1. 单层路由和嵌套路由

单层路由是指所有的路由都在同一层级下进行管理,通常用于简单的应用程序中。嵌套路由是指路由之间可以存在层级关系,通常用于复杂的应用程序中,例如应用程序中存在多个模块或者页面间存在关联关系。

  1. 客户端路由和服务器端路由

客户端路由是指通过 JavaScript 在客户端实现的路由,通过浏览器的 History API 来进行 URL 地址的控制和变化。服务器端路由是指通过服务器端的路由规则来处理请求,服务器端路由通常是通过 MVC 或者 RESTful 架构实现的。

根据不同的分类方式,路由的实现方式和应用场景也会有所不同。在实际应用程序中,需要根据应用程序的需求和技术选型来选择合适的路由实现方式。

3 前端路由原理

前端路由原理,底层借助于BOM中的history来完成,我们在浏览器控制台通过window.history打印看看,如下所示:

在这里插入图片描述

目前前端路由两种实现方式:

  • Hash模式
  • History模式:html5

History模式,演示示例代码3-1如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>前端路由的基石_history</title>
</head>
<body>
	<a href="http://www.atguigu.com" onclick="return push('/test1') ">push test1</a><br><br>
	<button onClick="push('/test2')">push test2</button><br><br>
	<button onClick="replace('/test3')">replace test3</button><br><br>
	<button onClick="back()">&lt;= 回退</button>
	<button onClick="forword()">前进 =&gt;</button>

	<script type="text/javascript" src="https://cdn.bootcss.com/history/4.7.2/history.js"></script>
	<script type="text/javascript">
		let history = History.createBrowserHistory() //方法一,直接使用H5推出的history身上的API
		// let history = History.createHashHistory() //方法二,hash值(锚点)

		function push (path) {
			history.push(path)
			return false
		}

		function replace (path) {
			history.replace(path)
		}

		function back() {
			history.goBack()
		}

		function forword() {
			history.goForward()
		}

		history.listen((location) => {
			console.log('请求路由路径变化了', location)
		})
	</script>
</body>
</html>
  • history.js是对原生window.history的封装,提供了更友好的API。

下面输出效果图3-1如下所示:

在这里插入图片描述

Hash模式演示,只需要修改如下注释即可:

// let history = History.createBrowserHistory() //方法一,直接使用H5推出的history身上的API
let history = History.createHashHistory() //方法二,hash值(锚点)

输出结果图3-2如下所示:

在这里插入图片描述

两种实现模式对比:

对比点Hash 模式History 模式
美观性带着 # 字符,较丑简洁美观
兼容性兼容性好html5加入,老浏览器可能不支持
实用性不需要对服务端做改动需要服务端对路由进行相应配合设置

结语

❓QQ:806797785

⭐️源代码仓库地址:https://github.com/gaogzhen/react-staging.git

参考:

[1]React视频教程[CP/OL].2020-12-15.p74-76.

[2]React官网[CP/OL].

[3]ChatGPT[CP/OL].

[4] 对SPA(单页应用)的理解

[5] 前端路由原理

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

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

相关文章

牛客刷题错题解析

以下是Video/Audio中会触发的事件的有&#xff1f; load play seeked abort 网址&#xff1a;https://www.nowcoder.com/questionTerminal/fc3b560267fd44e98d02a40a 方法&#xff1a;load() play() pause() 事件&#xff1a;play() playing() pause() seeked() seeking() abor…

Linux移植5.4版本内核:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(5.4版本内核)

Linux移植5.4版本内核&#xff1a;正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤&#xff08;5.4版本内核&#xff09; 文章目录 Linux移植5.4版本内核&#xff1a;正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤&#xff08;5.4版本内核&#xff09;1.出厂源…

浅理解JavaScript数组去重的方法(划重点),当面试官问如何实现数组去重时,你可以这样做...

文章目录 &#x1f4cb;前言&#x1f3af;什么是数组去重&#xff0c;运用场景是什么&#xff1f;&#x1f3af;常用的数组去重方法&#x1f9e9;使用 Set 对象&#x1f9e9;使用 Object&#xff08;对象、基于Hash哈希表&#xff09; 或 Map&#x1f9e9;使用 filter 方法与 i…

概率图降低表示需要的参数指的是什么?(贝叶斯网络) 结构化概率模型

深度学习中经常要对概率密度建模。对于多维度随机变量来说&#xff0c;这有些困难。概率化结构&#xff08;既图模型&#xff09;是处理这个问题的手段之一。这引出了两个问题。为什么建模困难&#xff1f;图模型怎样解决了这个困难&#xff1f; 关于这个问题&#xff0c;花书…

图片怎么压缩到200K以内,这3个图片压缩方法,简单有效

你没有遇到过上传图片到网站的时候&#xff0c;图片太大不能上传的情况&#xff1f;还有&#xff0c;许多报名照片要求小于200K&#xff0c;可是照片超过这个大小&#xff0c;应该如何压缩呢&#xff1f;下面我给大家带来3个图片压缩的方法&#xff0c;既能快速压缩图片大小&am…

深度学习技巧应用7-K折交叉验证的实践操作

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习技巧应用7-K折交叉验证的实践操作。K折交叉验证是一种机器学习中常用的模型验证和选择方式&#xff0c;它可以将数据集分为K个互斥的子集&#xff0c;其中K-1个子集作为训练集&#xff0c;剩下1个子集作为验…

Hive设置元数据支持中文显示

在hive中建外部表时遇见到这样一个问题&#xff0c;就是表字段的中文注释在desc 表结构时看不了&#xff0c;发现原来是Hive的元数据库没有设置支持中文显示 第一步&#xff0c;在元数据库metastore完成初始化后&#xff0c;再次登录MySQL [roothurys24 hurys_table_data]# m…

成功解决:OSError: [E050] Can’t find model ‘en_core_web_sm’.

成功解决OSError: [E050] Can’t find model ‘en_core_web_sm’. 问题描述 在安装spacy包之后&#xff0c;再加载’en_core_web_sm’语言模型时&#xff0c;报出OSError: [E050] Can’t find model ‘en_core_web_sm’. It doesn’t seem to be a Python package or a valid…

【Java】插入排序和希尔排序---图解超详细

目录 插入排序 插入排序的核心图解 希尔排序 希尔排序详细图解 插入排序 插入排序的交换精髓在于 每次随着i的扩大,i走过的路径都是有序的,这和冒泡的思想有异曲同工之处,冒泡是i走一次,数组的最后变成有序的,而插入排序是 插入排序是 i 在前面 j在后面 插入排序的核心图解…

C- 符号

文章目录 符号#ifdef-#endif\接续符转义旋转光标数字倒计时 单引号-双引号逻辑运算符&& ||短路 位运算符异或位运算最好使用定义好的宏左移右移 后置前置复杂表达式 取整0向取整(C中默认取整方式)floor地板取整ceilround 四舍五入 取模取余和取模一样吗? 运算符优先级…

两小时让你全方位的认识文件(一)

想必友友们在生活中经常会使用到各种各样的文件&#xff0c;那么我们是否了解它其中的奥秘呢&#xff0c;今天阿博就带领友友们深入地走入文件&#x1f6e9;️&#x1f6e9;️&#x1f6e9;️ 文章目录 一.为什么使用文件二.什么是文件三.文件的打开和关闭四.文件的顺序读写 一…

网页自动化工具DrissionPage

逛Github时偶然看到的开源项目&#xff0c;DrissionPage是一款新的基于 python 的网页自动化工具。 笔者已测试过&#xff0c;给大家推荐下。 项目地址&#xff1a;https://gitee.com/g1879/DrissionPage 安装测试 安装命令 pip install DrissionPage测试 from Drissio…

unity | 处理string常用的知识(持续更新)

一、转义字符和的用法 1.常规用法 我们现在有一行字&#xff0c;但是我对它的格式之类的有要求 例&#xff1a;天无绝人之路&#xff0c;条条道路通罗马。 我想打成&#xff1a; 天无绝人之路&#xff0c; 条条道路通罗马。 换行前&#xff0c;写法是&#xff1a; string s …

科海思—美国杜笙Tulsimer中国区总代理,制糖脱色树脂A-722

一、产品介绍 具有控制孔径的大孔强碱性Ⅰ型阴特种脱色用离子交换树脂 Tulsimer A-722是一款具有便于颜色和有机物去除的控制孔径的&#xff0c;专门开发的大孔强碱性Ⅰ型阴离子交换树脂。 Tulsimer A-722 &#xff08;氯型&#xff09;专门应用于糖浆脱色。 Tulsimer A…

Python学习简记

常用数据类型 整数类型int 二进制以0b开头八进制以0o开头十六进制以0x开头 这里还有一个值得注意的点&#xff1a;python中的整型是“无限长”的&#xff0c;因此它可以表示任何数 浮点数 python中只有float作为浮点数&#xff0c;没有double 主要注意python中对浮点数与Decima…

Spring系统架构与主要概念

Spring系统架构与主要概念 Spring Framework系统架构Core Container 核心容器AOP 层数据层Web层测试层 业务逻辑Spring之前遇到的问题解决方案 Spring核心概念IOC&#xff08;Inversion of Control&#xff09;控制反转DI&#xff08;Dependency Injection&#xff09;依赖注入…

SRv6实践项目(四):基于YANG的配置下发

在本章节&#xff0c;主要是了解YANG是什么&#xff0c;以及基于YANG下发配置的工作原理&#xff1a; 1.什么是YANG 在介绍之前&#xff0c;为了给大家一个最直观的感受&#xff0c;我们打开yang工具&#xff0c;它被打包成一个容器了&#xff0c;可以轻松的使用&#xff0c;…

完美解决丨1. **`SyntaxError: invalid syntax`**

SyntaxError: invalid syntax 因为没有符合语法要求&#xff0c;导致报错。 解决办法&#xff1a; 语法错误的原因主要是代码的风格&#xff0c;例如&#xff1a; 左括号或者右括号没有配对&#xff1b;左括号或者右括号没有放在语句的正确位置&#xff1b;缺少冒号&#xff1…

Window10下安装DPDK

由于我装的是vs2019&#xff0c;打开Visual Studio Installer&#xff0c;在可选下&#xff0c;选择Windows 10 SDK&#xff0c;点击修改。 右键此电脑属性&#xff0c;查看Windows10版本。 安装WDK&#xff0c;打开网址https://learn.microsoft.com/zh-cn/windows-hardware/…

计算机系统-链接

例行前言&#xff1a; 本篇不是学习课程时的笔记&#xff0c;是重看这本书时的简记。对于学习本课程的同学&#xff0c;未涉及的内容不代表考试不涉及&#xff0c;部分省略的部分是在该课程的讨论课中学习的(PIC&#xff0c;放出了我在讨论课中的PPT作为参考)&#xff0c;核心…