深入理解 hash 和 history:网页导航的基础(上)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 介绍 hash 和 history 的背景
    • 为什么需要了解 hash 和 history
  • 二、 hash 的基本概念
  • 三、 history 的基本概念
  • 四、 hash 和 history 的区别
    • 比较 hash 和 history 的不同之处
    • 在应用场景中的选择

一、引言

介绍 hash 和 history 的背景

Hash 和 History 是两种不同的路由模式,它们的背景如下:

  • Hash 模式:
    • URL 中的 hash 值只是客户端的一种状态,不会被发送到服务器。
    • hash 值的改变都会在浏览器的访问历史中增加一个记录,因此可以通过浏览器的前进、回退按钮控制 hash 的切换。
    • 可以通过 JavaScript 对 location.hash 进行赋值,来改变 URL 中的 hash 值。
    • 可以用 hashchange 事件监听 hash 值的变化,从而对页面进行跳转并渲染。

在这里插入图片描述

  • History 模式:
    • HTML5 提供了 History API,可以在不进行刷新的情况下,操作浏览器的历史纪录。
    • 可以使用 popstate 事件来监听 URL 的变化,从而对页面进行跳转和渲染。
    • history.pushState()或 history.replaceState()不会触发 popstate 事件,这时需要手动触发页面跳转。

在这里插入图片描述

总的来说,Hash 模式是早期的路由实现方式,而 History 模式则是 HTML5 提供的一种更现代的解决方案。

为什么需要了解 hash 和 history

在前端开发中,了解 hash 和 history 是很重要的,因为它们是实现前端路由的两种主要方式

具体原因如下:

  • 构建SPA(单页面应用):对于 Vue 这类渐进式前端开发框架,为了构建 SPA,需要引入前端路由系统,这也就是 Vue-Router 存在的意义。
  • 实现页面跳转:浏览器提供了两种支持前端路由的方式,即 hash 和 history。通过改变 URL,实现页面跳转,同时不会向后端发送请求。

总的来说,了解 hash 和 history 对于构建高效、用户友好的前端应用程序至关重要。

二、 hash 的基本概念

在前端路由中,hash指的是 URL 中的#符号后面的部分。例如,https://example.com/#/about中的#/about就是一个hash

  1. 什么是 hash: 在前端路由中,hash是指 URL 中#后面的部分。它可以用来在不刷新页面的情况下,通过改变hash值来进行页面的导航。

  2. hash 的特点和用途:

  • 不发送给服务器:浏览器在访问带有hash的 URL 时,不会将hash部分发送给服务器。这意味着服务器端无法获取或处理hash值。
  • 只在客户端生效:hash的变化只在客户端生效,不会导致服务器端的请求或页面刷新。
  • 简单且兼容性好:hash的实现相对简单,并且在大多数浏览器中都得到了很好的支持,包括旧版本的浏览器。
  • 用于前端路由:在单页面应用(SPA)中,前端路由可以利用hash来进行页面的切换。通过监听hashchange事件,可以根据hash的变化来加载不同的页面内容。

在这里插入图片描述

  1. hash 的变化和更新机制: 当用户点击链接或在浏览器中手动修改hash值时,浏览器会触发hashchange事件。在hashchange事件中,可以通过获取当前的hash值来进行相应的页面更新或路由处理。此外,还可以通过使用 History API(如 HTML5 的 History API)来实现更高级的前端路由功能,提供更好的用户体验。

三、 history 的基本概念

在前端路由中,history指的是 History API,它是 HTML5 提供的一种用于管理浏览器历史记录的接口。通过 History API,可以在不刷新页面的情况下,修改 URL 的hash值或使用新的 URL,实现页面的导航和状态管理。

  1. 特点:
  • 不刷新页面:使用 History API 进行页面导航时,不会触发页面的刷新,从而提供了更好的用户体验。
  • 可修改 URL:可以通过修改 URL 的hash值或使用新的 URL,来反映页面的状态变化。
  • 状态管理:结合前端路由框架,可以将页面的状态与 URL 关联起来,实现基于 URL 的状态管理。
  1. 用途:
  • 实现单页面应用(SPA):通过使用 History API,可以在单页面应用中实现页面的路由和状态管理,提供流畅的用户体验。
  • 改善用户体验:避免了页面刷新带来的用户体验问题,如页面内容的丢失、重新加载等。
  • 与服务器端配合:可以与服务器端进行配合,实现服务器端渲染(SSR)或渐进式渲染。
  1. 变化和更新机制: History API 提供了两种方式来修改 URL:
  • hashchange事件:通过修改 URL 的hash值来触发页面的导航。当hash发生变化时,浏览器会触发hashchange事件。
  • History.pushState()和 History.replaceState()方法:可以使用这两个方法来在浏览器历史记录中新增或替换条目,从而修改 URL。这两种方式不会触发页面的刷新。

通过监听hashchange事件或使用 History.pushState()和 History.replaceState()方法,可以在前端路由中根据 URL 的变化来加载不同的页面内容或执行相应的逻辑。同时,也可以通过回退和前进按钮来浏览历史记录中的不同页面状态。

需要注意的是,使用 History API 需要考虑一些兼容性问题,并且在某些情况下可能需要服务器端的配合来处理 URL 的变化。

四、 hash 和 history 的区别

比较 hash 和 history 的不同之处

hashhistory是前端路由中常用的两种方式,它们的主要不同之处在于以下几个方面:

  1. URL 格式:
  • hash方式使用 URL 的hash部分来表示路由状态,例如https://example.com/#/about
  • history方式使用正常的 URL 结构来表示路由状态,例如https://example.com/about
  1. 页面刷新:
  • hash方式的 URL 变化不会触发页面的刷新,因为浏览器认为hash部分是属于页面内部的。
  • history方式的 URL 变化可能会触发页面的刷新,除非使用了特定的技术(如 History API)来处理。
  1. 兼容性:
  • hash方式在所有的浏览器中都能正常工作,包括较旧的浏览器。
  • history方式需要支持 HTML5 History API 的浏览器才能正常工作,较旧的浏览器可能需要使用 polyfill 来实现兼容。
  1. 服务器端处理:
  • hash方式的 URL 变化不会被服务器端感知,因为服务器端只处理 URL 中不带hash部分的请求。
  • history方式的 URL 变化可以被服务器端感知,如果需要在服务器端进行处理,可能需要在服务器端配置相应的路由处理。

总体来说,hash方式更适合简单的单页面应用,而history方式更适合复杂的单页面应用或需要与服务器端进行交互的应用。在选择使用哪种方式时,需要根据具体的需求和项目的特点来进行考虑。

在应用场景中的选择

在应用场景中选择使用hash还是history,可以考虑以下几个因素:

  1. 兼容性:如果应用需要支持较旧的浏览器或移动设备,可能需要选择hash方式,因为它在所有的浏览器中都能正常工作。

  2. 用户体验:如果希望提供更好的用户体验,避免页面刷新,可以选择history方式。hash方式的 URL 中带有#符号,可能会让用户感到困惑。

  3. 服务器端处理:如果应用需要与服务器端进行交互,或者需要在服务器端进行路由处理,可能需要选择history方式。使用hash方式时,服务器端无法感知 URL 中的hash部分。

  4. 应用复杂度:如果应用比较简单,只有少数页面,可能选择hash方式就足够了。如果应用比较复杂,有多个页面或路由状态,可能需要选择history方式来更好地管理路由。

在这里插入图片描述

综合考虑以上因素,可以根据具体的应用场景和需求来选择使用hash还是history。在实际开发中,也可以先使用hash方式进行开发,然后在需要时再迁移到history方式。

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

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

相关文章

二维差分详解

前言 上一期我们分享了一维差分的使用方法,这一期我们将接着上期的内容带大家了解二位差分的使用方法,话不多说,LET’S GO!(上一期链接) 二维差分 二维差分我们可以用于对矩阵区间进行多次操作的题。 二维差分我们还…

springAop有哪五种通知类型?可根据图标查看!

Spring AOP的通知类型有以下几种(后面是图标变化): 1.Before通知: 在目标方法执行前执行。 上白下红,方法前执行。 2.After通知: 在目标方法执行后(无论是否发生异常)执行。 图标…

文件操作(一、fgets和fputs、fscanf和fprintf、fread 和 fwrite、fopen和fclose、fgetc和fputc)

目录 一、文件的概念 1. 什么是文件?​ 2. 为什么使用文件?​ 3.分件的分类 3.1 程序文件​ 3.2 数据文件​ 3.3磁盘文件: 3.4设备文件: 4.文件名​ 二、二进制文件和文本文件?​ 文本文件与二进制文件区别 三、流和标准流 3.1流…

记录一下github深度学习的错误

1.[visdom]无法正常启动服务问题解决 在Anaconda命令窗口中: 使用python -m visdom.server启动visdom服务时,卡在: Checking for scripts. Downloading scripts, this may take a little while 无法下载和启动服务。 ERROR:由…

设计模式-策略(Strategy)模式

又被称为政策(方针)模式策略模式(Strategy Design Pattern):封装可以互换的行为,并使用委托来决定要使用哪一个策略模式是一种行为设计模式,它能让你定义一系列算法,并将每种算法分别放入独立的类中&#x…

[MySQL]数据库概述

目录 1.什么是数据库 2.数据库分类 2.1关系型数据库 2.2非关系型数据库 1.什么是数据库 我们知道,存储数据可以使用文件来存储。那么为什么我们还要大费周章的去设计和使用数据库呢? 因为文件保存数据有以下几个缺点: 1.文件的安全性不…

浅谈MapReduce

MapReduce是一个抽象的分布式计算模型,主要对键值对进行运算处理。用户需要提供两个自定义函数: map:用于接受输入,并生成中间键值对。reduce:接受map输出的中间键值对集合,进行sorting后进行合并和数据规…

clickhouse函数记录

日期函数 SELECT formatDateTime(create_time,%Y-%m-%d) AS time FROM xx.xx;

安路IP核应用举例(OSC、UART)

1.OSC(内部振荡器) 按照Project->New Project顺序新建工程后,后按照Tools->IP Generator顺序,创建IP核,如下图: 安路FPGA的内置OSC振荡模块频率可选30MHz、60MHz。 可选Verilog或VHDL语言。 如图,生成的.v文件只…

【Linux】内核结构

一、Linux内核结构介绍 Linux内核结构框图 二、图解Linux系统架构 三、驱动认知 1、为什么要学习写驱动2、文件名与设备号3、open函数打通上层到底层硬件的详细过程 四、Shell Shell脚本 一、Linux内核结构介绍 Linux 内核是操作系统的核心部分,它负责管理系…

“Java 已死、前端已凉”?技术变革与编程语言前景:Java和前端的探讨

前端已死话题概论 本文讨论了近期IT圈中流传的“Java 已死、前端已凉”言论。我们审视了这些言论的真实性,并深入探讨了技术行业的演变和新兴技术的出现对编程语言和前端开发的影响。通过分析历史发展、当前趋势和未来展望,我们提供了对这些话题更深层次…

HBuilderX 配置 夜神模拟器 详细图文教程

在电脑端查看App的效果,不用真机调试,下载一个模拟器就可以了 --- Nox Player,夜神模拟器,是一款 Android 模拟器。他的使用非常安全,最重要的是完全免费。 一. 安装模拟器 官网地址: (yeshen.com) 二.配…

探索性能测试的奥秘:流程与工具大揭秘!

一、性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 1.1 类别 性能测试包括负载测试、压力测试、基准测试等。 1.1.1 负载测试 通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证…

【MYSQL】事务隔离级别、脏读、不可重复读、幻读

文章目录 介绍演示脏读不可重复读可重复读幻读 不可重复读和幻读的区别 参考 作者 Guide: 事务隔离级别 美团技术团队: Innodb中的事务隔离级别和锁的关系 介绍 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交) :最低的隔离级别…

论文阅读——Semantic-SAM

Semantic-SAM可以做什么: 整合了七个数据集: 一般的分割数据集,目标级别分割数据集:MSCOCO, Objects365, ADE20k 部分分割数据集:PASCAL Part, PACO, PartImagenet, and SA-1B The datasets are SA-1B, COCO panopt…

java简易制作-王者荣耀游戏

一.准备工作 首先创建一个新的Java项目命名为“王者荣耀”,并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。 创建一个名为“img”的文件夹来储存所需的图片素材。 二.代码呈现 package com.sxt; import javax…

【设计模式--行为型--观察者模式】

设计模式--行为型--观察者模式 观察者模式定义结构案例优缺点使用场景JDK中提供的实现例:警察抓小偷 观察者模式 定义 又被成为发布订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生…

INFINI Labs 产品更新 | Easysearch 新增快照搜索功能,Console 支持 OpenSearch 存储

INFINI Labs 产品又更新啦~,包括 Easysearch v1.7.0、Console v1.13.0。本次各产品更新了 Easysearch 快照搜索功能;Console 支持 OpenSearch 集群存储系统数据、优化了初始化安装向导流程等。 以下是本次更新的详细说明。 INFINI Easysearch v1.7.0 …

遥感论文 | ISPRS | 图神经网络也能做城市街道功能感知?纯视觉方案,效果可观!

论文题目:Knowledge and topology: A two layer spatially dependent graph neural networks to identify urban functions with time-series street view image论文网址:https://www.sciencedirect.com/science/article/pii/S0924271623000680论文代码&…

【lesson16】进程控制之进程替换(1)

文章目录 进程替换是什么?进程替换怎么用?不创建子进程时使用 进程替换是什么? 我们知道fork()之后,父子进程各自执行父进程的一部分代码,如果子进程就想执行一个全新的程序呢? 以前:父子代码…