路由的hash和history模式的区别

news2024/11/25 11:28:52

目录

✅ 路由模式概述

一. 路由的hash和history模式的区别

1. hash模式

2. history模式

3. 两种模式对比

二. 如何获取页面的hash变化


✅ 路由模式概述

单页应用是在移动互联时代诞生的,它的目标是不刷新整体页面,通过地址栏中的变化来决定内容区域显示什么内容。

要达成这个目标,我们要用到前端路由技术,具体来说有两种方式来实现:hash模式和history模式。hash模式是通过监听hashChange事件来实现的,history模式是通过pushState方法+popstate事件来实现的。 

一. 路由的hash和history模式的区别

Vue-Router有两种模式:hash模式和history模式。默认的路由模式是hash模式。

1. hash模式

◼️ 简介

hash模式(又称哈希路由)是开发中默认的模式,它的URL带着一个#,例如:http://www.abc.com/#/vue,它的hash值就是#/vue

◼️ 特点

hash值会出现在URL里面,但是不会出现在HTTP请求中,对后端完全没有影响,所以改变hash值,不会重新加载页面。这种模式的浏览器支持度很好,低版本的IE浏览器也支持这种模式。 hash路由被称为是前端路由,已经成为SPA(单页面应用)的标配。

◼️ 原理

hash模式的主要原理就是onhashchange()事件:

window.onhashchange = function(event){
	console.log(event.oldURL, event.newURL);
	let hash = location.hash.slice(1);
}

使用onhashchange()事件的好处就是,在页面的hash值发生变化时,无需向后端发起请求,window就可以监听事件的改变,并按规则加载相应的代码。 除此之外,hash值变化对应的URL都会被浏览器记录下来,这样浏览器就能实现页面的前进和后退。虽然是没有请求后端服务器,但是页面的hash值和对应的URL关联起来了。

hash模式是一种把前端路由的路径用 # 拼接在真实URL后面的模式。形式上,hash模式url里面永远带着#号,开发当中默认使用这个模式

原理是通过location.hash属性设置#后面的路径发生变化,并且浏览器并不会重新发起请求

只要hash地址发生改变,则会触发hashchange事件,我们在事件中设置地址对应的视图展示
 

hash模式的浏览器兼容性较好,就是看起来不够优雅。如果用户考虑url的规范,那么就需要使用history模式,因为history模式没有#号,是个正常的url,适合推广宣传;

2. history模式

◼️ 简介

history模式(又称历史路由)的URL中没有#,它使用的是传统的路由分发模式,即用户在输入一个URL时,服务器会接收这个请求,并解析这个URL,然后做出相应的逻辑处理。

◼️ 特点

当使用history模式时,URL就像这样:http://abc.com/user/id。相比hash模式更加好看。但是,history模式需要后台配置支持。如果后台没有正确配置,访问时会返回404。

history模式开发的SPA项目,需要服务器端做额外的配置,否则会出现刷新白屏(链接分享失效)。原因是页面刷新时,浏览器会向服务器真的发出对这个地址的请求,而这个文件资源又不存在,所以就报404。处理方式就由后端做一个保底映射:所有的请求全部拦截到index.html上。

◼️ API

history api可以分为两大部分,切换历史状态和修改历史状态:

修改历史状态:包括了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法,这两个方法应用于浏览器的历史记录栈,提供了对历史记录进行修改的功能。只是当他们进行修改时,虽然修改了url,但浏览器不会立即向后端发送请求。如果要做到改变url但又不刷新页面的效果,就需要前端用上这两个API。

切换历史状态: 包括forward()、back()、go()三个方法,对应浏览器的前进,后退,跳转操作。
虽然history模式丢弃了丑陋的#。但是,它也有自己的缺点,就是在刷新页面的时候,如果没有相应的路由或资源,就会刷出404来。 如果想要切换到history模式,就要进行以下配置(后端也要进行配置):

const router = new VueRouter({
  mode: 'history',
  routes: [...]
})

history模式用到了HTML5中的history API,允许开发者直接更新浏览器URL地址而不重新发起请求。

用到了history API:replaceState、pushState、back、forward和go这个5个方法。

但是历史记录改变以后,视图并不会更新,我们需要在地址改变(包括使用onpopstate事件监听历史记录的回退)后,重新设置视图

history兼容性不如hash模式,而且浏览器在刷新的时候会按照路径发送真实的资源请求,因此在线上部署基于historyAPI的单页面应用的时候,一定要后端配合支持才行(如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面) 

✅ 小 结:

👉🏻 两者原理不同

hash模式的实现原理是通过监听hashChange事件来实现的。

history模式是通过调用history.pushState方法(或者replaceState) 并且监听popstate事件来实现的。history.pushState会追加历史记录,并更换地址栏地址信息,但是页面不会刷新,需要手动调用地址变化之后的处理函数,并在处理函数内部决定跳转逻辑;监听popstate事件是为了响应浏览器的前进后退功能。

👉🏻 两者表现不同

hash模式会在地址栏中有#号,而history模式没有;同时由于history模式的实现原理用到H5的新特性,所以它对浏览器的兼容性有要求(IE >= 10)。 

3. 两种模式对比

调用 history.pushState() 相比于直接修改 hash,存在以下优势:

  • pushState() 设置的新 URL 可以是与当前 URL 同源的任意 URL;而 hash 只可修改 # 后面的部分,因此只能设置与当前 URL 同文档的 URL;
  • pushState() 设置的新 URL 可以与当前 URL 一模一样,这样也会把记录添加到栈中;而 hash 设置的新值必须与原来不一样才会触发动作将记录添加到栈中;
  • pushState() 通过 stateObject 参数可以添加任意类型的数据到记录中;而 hash 只可添加短字符串;
  • pushState() 可额外设置 title 属性供后续使用。
  • hash模式下,仅hash符号之前的url会被包含在请求中,后端如果没有做到对路由的全覆盖,也不会返回404错误;history模式下,前端的url必须和实际向后端发起请求的url一致,如果没有对用的路由处理,将返回404错误。

hash模式和history模式都有各自的优势和缺陷,我们还是要根据实际情况选择性的使用。

二. 如何获取页面的hash变化

(1)监听$route的变化

// 监听,当路由发生变化的时候执行
watch: {
  $route: {
    handler: function(val, oldVal){
      console.log(val);
    },
    // 深度观察监听
    deep: true
  }
},

(2)window.location.hash读取#值 window.location.hash 的值可读可写,读取来判断状态是否改变,写入时可以在不重载网页的前提下,添加一条历史访问记录。

参考资料:vue路由和vue3总结

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

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

相关文章

Three.js 创建网格辅助线,坐标轴辅助线,模型骨骼辅助线

three.js中的辅助线使用 1.网格辅助线(GridHelper) 2.坐标轴辅助线(AxesHelper) 3.模型骨骼辅助线(SkeletonHelper) 在上一篇 Three.js加载外部glb,fbx,gltf,obj 模型文件 的文章基础上新加入一个创建 辅助线的函数 createHel…

原型链污染例题复现

一、什么是原型链 下面我们通过这个小例子来看看。 可以看到b在实例化为test对象以后,就可以输出test类中的属性a了。这是因为在于js中的一个重要的概念:继承。而继承的整个过程就称为该类的原型链。 在javascript中,每个对象的都有一个指向他的原型(p…

CRM系统哪些功能可以个性化定制?

不同的企业有着不同的业务流程和需求,因此在选型时就需要一款可以个性化定制的CRM系统。下面说说可以个性化定制的CRM系统的功能和优势。 如何实现个性化定制? Zoho CRM支持个性化定制,您可以创建自定义功能模块、字段以及业务流程&#xf…

还在人工管理?太傻了!建筑行业高手给你支一招!

在现代科技日益发展的时代,智慧工地成为建筑行业的新兴趋势。借助先进的技术和数字化解决方案,智慧工地为建筑项目带来了前所未有的效率、安全性和可持续性。 智慧工地不仅提高了建筑施工的效率,也为管理人员提供了更好的决策依据和风险预测能…

MQTT(EMQX) - SpringBoot 整合MQTT 连接池 Demo - 附源代码 + 在线客服聊天架构图

MQTT 概述 MQTT (Message Queue Telemetry Transport) 是一个轻量级传输协议,它被设计用于轻量级的发布/订阅式消息传输,MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化。是一种简单、稳定、开放、轻量级易于实现的消息…

DLL的引入方式(DllImport的特殊引入方式)

Dll引入方式有四种: 1.就是普通的比如一个解决方案中有多个项目,将其他项目的引入到该项目中 2.就是软件自带的程序集的引入 3.就是使用dll的引入(普通的本身就是VS的dll文件) 4.就是使用dll的引入(不是属于该语言的…

网络音频终端音频编码解码终端

网络对讲终端SV-7011V 网络对讲终端SV-7011V,采用了ARM音频DSP架构,集网络对讲、网络广播、监听等功能于一身,内置麦克风、配置line out、line in、Mic in功能输出接口,适用于学校,机场,广场等场所。 产品…

解决 MySQL 删除数据后,ID 自增不连续问题

修复前 除了部分数据,导致后续新增的数据,ID 自增不连续 解决方案 执行下方 SQL 语句即可修复此问题,mbs_order为需要修复的表名 SET i0; UPDATE mbs_order SET id(i:i1); ALTER TABLE mbs_order AUTO_INCREMENT0;

NetApp 入门级全闪存系统 AFF A250:小巧而强大

NetApp 入门级全闪存系统 AFF A250:小巧而强大 作为 AFF A 系列中的入门级全闪存系统,AFF A250 不但可以简化数据管理,还能为您的所有工作负载提供令人惊叹的强劲动力,价格也平易近人。 AFF A250:您的新 IT 专家 AFF…

指向字符串常量(字符串右值)的char指针,free的时候为什么会报错?

起因是如下代码 char *p "abc"; free(p);先说结果,这里会报错,会报一个错误如下 一开始还没反应过来,只知道 “test_content” 是一个右值,这是一个指向右值的指针。 但是free的时候为什么会报错呢? 首…

HarmonyOS元服务开发实践:桌面卡片字典

一、项目说明 1.DEMO创意为卡片字典。 2.不同卡片显示不同内容:微卡、小卡、中卡、大卡,根据不同卡片特征显示同一个字的不同内容,基于用户习惯可选择喜欢的卡片。 3.万能卡片刷新:用户点击卡片刷新按钮查看新内容,同时…

NVM保姆级安装配置

nvm安装配置 1、NVM简介2、NVM安装三、NVM使用四、NVM常用命令 1、NVM简介 在项目开发过程中,使用到vue框架技术,需要安装node下载项目依赖,但经常会遇到node版本不匹配而导致无法正常下载,重新安装node却又很麻烦。为解决以上问…

浏览器调式的时候刷新页面network的日志和请求不会消失的解决办法

把“Preserve log”勾选去掉,F5刷新页面时,就是最新的日志,新的请求 把“Preserve log”勾上,F5刷新浏览器页面时,就会有历史日志,而不会消失

基于VR技术的新型实验室教学模式——VR线上生物实验室

随着科技的发展,虚拟现实技术已经逐渐走进了我们的生活。在教育领域中,虚拟现实技术也被广泛应用于各种学科的教学中。其中,VR线上生物实验室是广州华锐互动开发的,一种基于VR技术的新型教学模式,它能够为学生提供更加…

开源免费用|Apache Doris 2.0 推出跨集群数据复制功能

随着企业业务的发展,系统架构趋于复杂、数据规模不断增大,数据分布存储在不同的地域、数据中心或云平台上的现象越发普遍,如何保证数据的可靠性和在线服务的连续性成为人们关注的重点。在此基础上,跨集群复制(Cross-Cl…

镜头基础知识

本文介绍镜头基础知识。 1.焦距 焦距指透镜中心到光聚集之焦点的距离,如下图,通常用f表示。 焦距是正值,一束平行光将会聚集在一个点上,焦距是负值,一束平行光在通过透镜之后将会扩散开。 注意: 1)这里…

【Winform学习笔记(五)】引用自定义控件库(dll文件)

引用自定义控件库dll文件 前言正文1、生成dll文件2、选择工具箱项3、选择需要导入的dll文件4、确定需要导入的控件5、导入及使用 前言 在本文中主要介绍 如何引用自定义控件库(dll文件)。 正文 1、生成dll文件 通过生成解决方案 或 重新生成解决方案 生成 dll 文件 生成的…

MybatisPlus注意点

1、表id过长 默认生成的id过长,不是从1开始需要加如下注解,如果表已经建立,需要重新建表才生效 2、MybatisPlus表明字段非数据库字段 mybatis-plus 就可以用注解 TableField(exist false) 表明字段非数据库字段 TableName(value "o…

第十一次CCF计算机软件能力认证

第一题:打酱油 小明带着 N 元钱去买酱油。 酱油 10 块钱一瓶,商家进行促销,每买 3 瓶送 1 瓶,或者每买 5 瓶送 2 瓶。 请问小明最多可以得到多少瓶酱油。 输入格式 输入的第一行包含一个整数 N,表示小明可用于买酱油的…

第2章 C语言概述

本章介绍以下内容: 运算符: 函数:main()、printf() 编写一个简单的C程序 创建整型变量,为其赋值并在屏幕上显示其值 换行字符 如何在程序中写注释,创建包含多个函数的程序,发现程序的错误 什么是关键字 C程…