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

在这里插入图片描述

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

文章目录

  • 五、使用 hash 和 history 的场景
    • 适合使用 hash 的场景
    • 适合使用 history 的场景
  • 六、实际案例分析
    • 通过具体的代码示例来演示 hash 和 history 的用法
  • 七、注意事项和最佳实践
    • 使用 hash 和 history 时需要注意的一些问题
    • 一些最佳实践和建议
  • 八、总结
    • 总结 hash 和 history 的作用和应用场景

五、使用 hash 和 history 的场景

适合使用 hash 的场景

适合使用hash的场景包括:

  1. 简单的单页面应用(SPA):如果应用只有少数几个页面,或者页面之间的导航相对简单,可以使用hash来实现。

  2. 兼容性要求较高的应用:由于hash方式在所有的浏览器中都能正常工作,因此如果应用需要支持较旧的浏览器或移动设备,可以选择hash

  3. 不需要与服务器端进行交互的应用:如果应用不需要与服务器端进行交互,或者服务器端不需要处理 URL 中的hash部分,可以使用hash

  4. 快速开发原型:在开发初期或快速搭建原型时,可以使用hash方式,因为它相对简单,不需要太多的配置和代码。

在这里插入图片描述

总的来说,hash方式适用于简单的、兼容性要求较高的、不需要与服务器端进行交互的应用,或者在开发初期快速搭建原型时使用。

适合使用 history 的场景

适合使用history的场景包括:

  1. 复杂的单页面应用(SPA):如果应用有多个页面或路由状态,需要进行复杂的页面导航和状态管理,可以使用history来实现。

  2. 需要与服务器端进行交互的应用:如果应用需要与服务器端进行交互,或者需要在服务器端处理 URL 中的路径部分,可以选择history

  3. 提供更好的用户体验:由于history方式的 URL 不带hash符号,看起来更像是正常的 URL,因此可以提供更好的用户体验。

  4. 移动应用:对于移动应用,使用history可以提供更流畅的用户体验,因为在移动设备上,使用hash可能会导致一些问题,如链接无法正常工作等。

在这里插入图片描述

总的来说,history方式适用于复杂的、需要与服务器端进行交互的、提供更好的用户体验的应用,或者在移动应用中使用。

六、实际案例分析

通过具体的代码示例来演示 hash 和 history 的用法

以下是使用hashhistory实现前端路由的简单示例代码。

  1. 使用hash的示例代码:

    // 创建一个路由器实例
    const router = new Router({
      mode: 'hash',
      routes: [
        { path: '/', component: Home },
        { path: '/about', component: About },
      ],
    });
    
    // 监听路由变化
    router.onReady(() => {
      console.log('Router is ready!');
    });
    
    // 应用到 HTML 页面上
    <div id="app">
      <RouterView />
    </div>
    

    在上述示例中,使用了Vue.jsRouter模块来创建一个简单的路由器。通过设置modehash,可以使用hash方式进行路由。定义了两个路由路径/''/about',并分别对应HomeAbout组件。

  2. 使用history的示例代码:

    // 创建一个路由器实例
    const router = new Router({
      mode: 'history',
      routes: [
        { path: '/', component: Home },
        { path: '/about', component: About },
      ],
    });
    
    // 监听路由变化
    router.onReady(() => {
      console.log('Router is ready!');
    });
    
    // 应用到 HTML 页面上
    <div id="app">
      <RouterView />
    </div>
    

    与使用hash的示例类似,只是将mode设置为history,以使用history方式进行路由。

请注意,在实际应用中,可能需要根据项目的具体需求进行一些配置和调整,例如处理页面的加载状态、设置basename等。这些示例只是提供了一个简单的框架,你可以根据自己的项目进行扩展和定制。

七、注意事项和最佳实践

使用 hash 和 history 时需要注意的一些问题

使用hashhistory时需要注意以下问题:

  • hash模式的优点:只需要前端配置路由表,不需要后端的参与;兼容性好,浏览器都能支持;hash值改变不会向后端发送请求,完全属于前端路由。缺点:hash值前面需要加#,不符合url规范,也不美观。
  • history模式的优点:符合url地址规范,不需要#,使用起来比较美观。缺点:在用户手动输入地址或刷新页面时会发起url请求,后端需要配置index.html页面用户匹配不到静态资源的情况,否则会出现404错误;兼容性比较差,是利用了HTML5 History对象中新增的pushState()和replaceState()方法,需要特定浏览器的支持。

在实际应用中,你可以根据具体需求和目标来选择使用哪种模式。如果你更注重前端的开发和维护,并且不需要与后端进行交互,那么hash模式可能更适合你;如果你希望实现更加直观和符合标准的url路径,并且后端支持对应的路由配置,那么history模式可能更适合你。

一些最佳实践和建议

以下是一些使用hashhistory的最佳实践和建议:

  1. 根据应用需求选择模式:如果你的应用主要是单页面应用,并且不需要与服务器端进行交互,或者对浏览器兼容性要求较高,那么可以选择hash模式。如果你需要更好的用户体验和 URL 结构,并且服务器端可以处理路由,那么可以选择history模式。

  2. 合理配置路由:无论是使用hash还是history,都需要合理配置路由。确保每个路由都有唯一的路径,并根据应用的逻辑进行组织。同时,为了避免冲突,建议使用命名路由。

  3. 处理页面加载状态:在使用history模式时,需要特别注意处理页面的加载状态。可以使用Vue.js的生命周期钩子函数来监听路由的变化,并在需要时进行数据加载或其他操作。

  4. 设置适当的basename:如果你的应用部署在子路径下,例如https://example.com/my-app/,那么可以设置basename来确保路由的正确工作。在Vue.js中,可以通过Router对象的basename属性来设置。

  5. 考虑浏览器兼容性history模式需要较新的浏览器版本支持。在使用history模式时,需要确保你的应用能够在目标用户的浏览器上正常工作。如果对兼容性有要求,可以考虑使用hash模式或提供降级方案。

  6. 测试和调试:在开发过程中,务必进行充分的测试,包括在不同浏览器和设备上进行测试。使用浏览器的开发者工具可以方便地调试路由和查看路由状态。

在这里插入图片描述

总之,选择使用hash还是history模式取决于你的应用需求和目标用户。合理配置路由、处理页面加载状态、设置适当的basename以及考虑浏览器兼容性是使用这两种模式的关键。

八、总结

总结 hash 和 history 的作用和应用场景

hashhistory是前端路由的两种模式,它们有不同的作用和应用场景:

  • hash模式:
    • 作用:根据当前的路由地址找到对应组件进行重新渲染。
    • 优点:不需要服务端的支持,在开发模式下使用。
    • 缺点:带有“#”,不够美观。
    • 应用场景:一般在生产或开发模式下使用。
  • history模式:
    • 作用:所有路由呈现都需要通过监听popstate事件,来进行相应的路由匹配和跳转。
    • 优点:没有“#”,使用真正的 URL 路径,较为美观。
    • 缺点:需要服务端的支持。
    • 应用场景:项目上线时,有服务端的支持时使用。

在实际应用中,你可以根据具体需求选择合适的路由模式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言——输出魔方阵

目录 一、前言&#xff1a; 二、算法设计&#xff1a; 三、代码实现&#xff1a; 五、效果展示&#xff1a; 一、前言&#xff1a; 魔方矩阵又称幻方&#xff0c;是有相同的行数和列数&#xff0c;并在每行每列、对角线上的和都相等的矩阵。魔方矩阵中的每个元素不能相同。你…

华为数通——网络参考模型

OSI参考模型 七层 应用层&#xff1a;最靠近用户的一层&#xff0c;为应用程序提供网络服务。 六层 表示层&#xff1a;数据格式转换编码格式UTF-8。 五层 会话层&#xff1a;双方之间建立、管理和终止会话。 四层 传输层&#xff1a;建立、维护和取消端到端的数据传输过…

七. 使用ts写一个贪吃蛇小游戏

之前学习了几篇的ts基础&#xff0c;今天我们就使用ts来完成一个贪吃蛇的小游戏。 游戏拆解 我们将我们的任务进行简单拆解分析。 首先我们应该有一个窗口&#xff0c;我们叫做屏幕。让蛇在里面移动&#xff0c;所有我们应该想到要设计一个大盒子当作地图。考虑到食物以及蛇…

Spark编程实验一:Spark和Hadoop的安装使用

一、目的与要求 1、掌握在Linux虚拟机中安装Hadoop和Spark的方法&#xff1b; 2、熟悉HDFS的基本使用方法&#xff1b; 3、掌握使用Spark访问本地文件和HDFS文件的方法。 二、实验内容 1、安装Hadoop和Spark 进入Linux系统&#xff0c;完成Hadoop伪分布式模式的安装。完成Ha…

字符串——OJ题

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、字符串相加1、题目讲解2、思路讲解3、代码实现 二、仅仅反转字母1、题目讲解2、思路讲解3…

DSP的ADC简单笔记

DSP不需要复用GPIO&#xff0c;是单独的ADC引脚&#xff0c;与GPIO不共用 ADC时钟在PCLKCR0寄存器 所以还要配置HSPCLK HISPCP/HSPCLK寄存器 所以ADC的输入时钟&#xff0c;有固定公式&#xff1b; 控制寄存器1 简单配置3个东西&#xff1b; 控制寄存器2 设置为1软件触发 控…

如何使用ArcGIS Pro拼接影像

为了方便数据的存储和传输&#xff0c;我们在网上获取到的影像一般都是分块的&#xff0c;正式使用之前需要对这些影像进行拼接&#xff0c;这里为大家介绍一下ArcGIS Pro中拼接影像的方法&#xff0c;希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的…

GZ015 机器人系统集成应用技术样题2-学生赛

2023年全国职业院校技能大赛 高职组“机器人系统集成应用技术”赛项 竞赛任务书&#xff08;学生赛&#xff09; 样题2 选手须知&#xff1a; 本任务书共 25页&#xff0c;如出现任务书缺页、字迹不清等问题&#xff0c;请及时向裁判示意&#xff0c;并进行任务书的更换。参赛队…

【Qt QML 入门】TextField

TextField 是一个单行文本编辑器&#xff0c;它继承自TextInput&#xff0c;具备TextInput的所有功能&#xff0c;同时扩展了 TextInput 并增加了占位符文本功能和装饰选项。 自定义文本输入框&#xff1a; import QtQuick import QtQuick.Window import QtQuick.ControlsWindo…

【Android】MVC与MVP的区别,MVP网络请求实践

一、MVC模式 目录 一、MVC模式二、MVP模式 1、MVP的简单应用 1.1 导入相关依赖包并设置权限1.2 实现Model1.2 实现Presenter1.3 实现View1.4分析项目结构和绑定过程1.5效果展示 2、MVP结合RxJava 一、MVC模式 MVC&#xff08;Model(模型)——View(视图)——Controller(控制…

QT-坦克大战游戏

QT-坦克大战游戏 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "score.h" Score::Score(){health30; maxHealthhealth;QLabel *label1 new QLabel(this);label1->setFrameStyle(QFrame::Plain | QFrame::Box);label1->setStyle…

element-plus 结合Vue Router时出现的问题及解决方法之一

1、单文件应用element-plus中的Menu 侧边栏 <template><el-row class"tac"><el-col :span"12"><!-- <h5 class"mb-2">Custom colors</h5> --><el-menuactive-text-color"#ffd04b"background-…

Leetcode—2414.最长的字母序连续子字符串的长度【中等】

2023每日刷题&#xff08;六十&#xff09; Leetcode—2414.最长的字母序连续子字符串的长度 实现代码 class Solution { public:int longestContinuousSubstring(string s) {int ans 1;int t 1;for(int i 1; i < s.size(); i) {if(s[i] - s[i - 1] 1) {t;ans max(an…

大数据生态圈kafka在物联网中的应用测试

背景 由物联网项目中使用到了Tbox应用管理车辆&#xff0c;在上报数据的过程中&#xff0c;需要将终端产生的数据通过kafka的produce topic customer对数据进行处理后&#xff0c;放置到mysql中。完成数据二进制到json转换工作。 Kafka的使用 查看kafka的topic ./kafka-topi…

直角三角形判断_分支结构 C语言xdoj56

问题描述 设直角三角形两条直角边长度为a和b&#xff0c;斜边长度为c&#xff0c;则a&#xff0c;b&#xff0c;c满足a^2b^2c^2&#xff0c; 输入三个整数a&#xff0c;b&#xff0c;c&#xff0c;判断对应的三角形是不是直角三角形&#xff0c;不是则输出“no”&#xff0…

docker consul容器自动与注册

微服务&#xff08;容器&#xff09;注册与发现&#xff1a;是一种分布式的管理系统&#xff0c;定位服务的方法。 在传统架构当中&#xff0c;应用程序之间直连到已知服务&#xff0c;设备提供的网络&#xff1a;IP地址&#xff0c;基于tcp/ip&#xff0c;端口&#x…

Apache Flume(4):日志文件监控

1 案例说明 企业中应用程序部署后会将日志写入到文件中&#xff0c;可以使用Flume从各个日志文件将日志收集到日志中心以便于查找和分析。 2 使用Exec Soucre Exec Source Exec Source通过指定命令监控文件的变化&#xff0c;加粗属性为必须设置的。 属性名默认值说明chan…

借助文档控件Aspose.Words,在Java中比较 Word、PDF 和 PPT 文档

文档比较是各个领域的一项关键任务&#xff0c;包括法律、出版和内容管理。它确保准确跟踪和审查对合同、报告或法律协议等文档的更改。Java 开发人员经常寻求高效可靠的方法来执行文档比较&#xff0c;而Aspose提供了强大的解决方案。在这篇博文中&#xff0c;我们将探讨如何高…

npm详解

NPM&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;用于管理和共享被发布到模块仓库的JavaScript代码. NPM的定义 NPM是Node.js的默认包管理工具&#xff0c;它的功能包括安装、管理、卸载和发布开源模块。NPM提供了一个模块仓库&#xff0c;开…

牛客网BC100有序序列合并

思路&#xff1a; 运用归并排序&#xff1a; 假设给定我们两个都是升序的数组&#xff0c;要求我们要把这两个数组以升序的方式合并到一个数组中&#xff0c;则我们就可以在这两个数组中分别各拿取一个元素进行比较&#xff0c;将二者之间较小值先放在这个新数组中&#xff0c…