首页 > 其他分享 >了解前端路由 hash 与 history 差异

了解前端路由 hash 与 history 差异

时间:2022-08-22 15:56:52浏览次数:56  
标签:hash URL 跳转 history com 路由 页面

路由跳转有两个模式可以选择 一个是hash 一个是 history 二者有什么区别呢 我们来细说

首先是路由默认的hash模式

hash模式最显著的特点就是会在url链接后面加是一个#

随便写一个例子

www.abc.com/#/def/hijk

#我们称之为哈希符号 而#后面的值我们都称之为哈希值

# 后面的路径发生变化时,浏览器并不会重新发起请求,这个时候服务器接收不到任何的值

对服务器没有影响,会在浏览器的访问历史中增加一个记录,使用 "后退" 按钮,就可以回到上一个位置。

我们假设一个场景当前的网址是www.abc.com/#/def

我们点击的一个路由 进入了www.abc.com/#/def/hijk

虽然我们点击了 页面发送了改变 但是我们并没有向服务器发送请求 我们的页面也没有重新加载浏览器还是继续保持在之前的页面

但是我们页面的内容确实变了 是因为发送了页面跳转 并不是从新去加载了

网页跳转 不等于 页面加载 页面的跳转都是在客户端进行操作 

特点:

  • url中带一个   #   
  • 可以改变URL,但不会触发页面重新加载,所以不算发送了一个HTTP请求
  • hash 通过 window.onhashchange 的方式,来监听 hash 的改变,借此实现无刷新跳转的功能
  • 只能修改  #  后面的部分,因此只能跳转与当前 URL 同文档的 URL 同时 #后面的部分我们称之为哈希值 并且哈希值它不会作为路径的一部分随着 http 请求,发给服务器

然后就是我们需要自己设置的histroy模式了

histroy模式他是使用到了H5的新特性 pushState() 和 replaceState() 方法。

为什么要有他?我想vue的团队只是不想在路径上加上# 或者说使用histroy的一些特有API吗

OK我们来说一下

history 是路由的另一种模式,由于 hash 模式会在 url 中带#,如果不想要带 #的话,我们可以使用路由的 history 模式 

并且因为是使用的H5的方法 所以对浏览器是有兼容性的要求的 它也符号者vue路由的一个特别重要的原则

果是用户在当前用histroy模式操作切换页面的话,URL会被改变、浏览器不会刷新页面也不会往服务端发请求 这一点和hash是一样的

举例子

正常的页面浏览
https://github.com/xxx 刷新页面

https://github.com/xxx/yyy 刷新页面

https://github.com/xxx/yyy/zzz 刷新页面
使用vue的histroy模式
https://github.com/xxx 刷新页面

https://github.com/xxx/yyy 前端跳转,不刷新页面

https://github.com/xxx/yyy/zzz 前端跳转,不刷新页面

但是 请注意!

如何我们在histroy模式下面访问

www.abc.com 我们一步步的进行点击 然后进入

www.abc.com/def/hijk 没有问题

但是如果我们直接在浏览器的链接栏www.abc.com/def/hijk 那就抱歉了会出错!

因为当你一步步点击的时候URL会被改变、浏览器不会刷新页面也不会往服务端发请求,但会触发代码内的监听事件从而改变页面内容,所以无需用到服务器也可以自由切换页面了。但是这里有个很核心的点就是URL会改变,即有新的URL诞生,所以如果这时用户主动刷新页面(F5) 你也可以理解为你可以理解为用户复制url后在新弹窗打开的行为,浏览器发送给服务端的是新的URL 如何没有对应的接口地址 那就会出错 

如何解决呢?就是服务器进行单独配置,弄一个接口去专门匹配 例如上面的www.abc.com/def/hijk 

而hash就不会遇到这个问题

好的总结一下

至此我们使用知道了 vue-roter 的两种路由模式,及差异化,简单来讲就是,hash 路由兼容梗好,但是带#显得丑些, histroy 和正常 url 路径一样,但是需要在服务器进行单独配置。大家可以根据自己的喜好去按需使用。

标签:hash,URL,跳转,history,com,路由,页面
From: https://www.cnblogs.com/tomxiao/p/16613045.html

相关文章

  • Jedis操作hash和Jedis操作list
    Jedis操作hash/***hash*/@Testpublicvoidtest3(){//1.获取连接Jedisjedis=newJedis();//如果使用空参构造,默认值"localhost",6379端口//存......
  • Hash index 实验中的Split Imgage Index
    在extendiblehashindex中,当插入导致bucket分裂或者移除导致bucket合并时,我们都要找到待分离或合并的bucket的另一半。分裂bucket时找另一半分裂bucket分两种情况,全局......
  • redis数据结构介绍和redis命令操作_string&hash
    redis的数据结构redis存储的是:key,value格式的数据,其中key都是字符串,value有物种不同的数据结构value的数据结构:字符串类型string哈希类型hash:map格式列表类型......
  • HashMap 详解
    JAVA基础1、自增(++)自减(--)运算符是一种特殊的算术运算符,在算术运算符中需要两个操作数来进行运算,而自增自减运算符是一个操作数。2、前缀自增自减法(++a,--a): 先进行自......
  • LeetCode 1472. Design Browser History
    原题链接在这里:https://leetcode.com/problems/design-browser-history/题目:Youhavea browser ofonetabwhereyoustartonthe homepage andyoucanvisitan......
  • RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。
    系列目录RabbitMQ入门系列:1、MQ的应用场景的选择与RabbitMQ安装。RabbitMQ入门系列:2、基础含义:链接、通道、队列、交换机。RabbitMQ入门系列:3、基础含义:持久化、......
  • 对于HashMap的容量的一些分析
    在Java开发中,我们经常会像如下方式以下创建一个HashMap:Map<String,String>map=newHashMap<String,String>();但是上面的代码中,我们并没有给HashMap指定容量,那么,这......
  • Flask 学习-2.url访问地址(路由配置)
    前言通过url地址可以访问一个网页,Flask框架使用route()装饰器来把函数绑定到URL。路由使用route()装饰器来把函数绑定到URL。fromflaskimportFlaskapp=......
  • 关于Vue路由懒加载问题
    今天刚开始新建一个vue项目,就在路由这卡死了,经过多次查找对比,发现了问题竟然是出现在一个括号上,如下所示constroutes=[//正确写法{path:'/',na......
  • redis数据结构介绍以及命令操作string和hash类型
    redis的数据结构redis存储的是:key,value格式的数据,其中key都是字符串,value有5中不同的数据结构value的数据结构:(1)字符串类型string......