hash路由模式

hash模式


hash模式是一种把前端路由的路径用井号 # 拼接在浏览器 URL 后面的模式。

一个完整的 URL 包括:协议、域名、端口、虚拟目录、文件名、参数、锚。

html 复制代码
https://www.wangyuegyq.top/utils/index.html?name=123&phone=123#home
  • 协议:https
  • 域名:www.wangyuegyq.top
  • 端口号:443,https默认端口号是443,http默认端口号是80,默认端口号可以不写
  • 虚拟目录:/utils
  • 文件名:index.html
  • 参数:name=123&phone=123
  • 锚部分:home(#后面的值)

hash作用


  1. 路由

    hash值的变化,会触发hashchange事件,这样我们就可以通过监听hashchanges事件来根据不同的hash值去渲染不同的UI,以实现路由切换的目的。

    更改路由方式:

    (1)a标签

    (2)location.hash、location.href

    (3)浏览器前进后退按键或者history.back、history.go、history.forward

    (4)history.pushState、history.replaceState(H5 history 新特性)

    html 复制代码
    <div>
      <a href="#home">首页</a>
      <a href="#article">文章</a>
      <div id="content"></div>
    </div>
    <script>
      window.onhashchange = (event) => {
        const hash = window.location.hash;
        const content = document.getElementById('content');
        if (hash === '#home') {
          content.innerHTML = '首页'; 
        } else if (hash === '#article') {
          content.innerHTML = '文章'; 
        }
      }
    </script>
  2. 定位

    hash也称作锚点,DOM id 结合,可以用于页面定位。

    html 复制代码
    <div>
    <span id="hash-position">定位点</span>
    <a href="#hash-position">点击定位</a>
    </div>

hash特点


  • hash的改变,不会访问服务器,不会刷新页面(hash 值是网页的标志位,HTTP 请求不包含锚部分,不会发送给服务器,对后端无影响)

  • hash的改变,会触发hashchange监听事件

  • hash的改变,会改变浏览器的历史记录

    这也是为什么当hash的改变(hash的改变会记录在window.hisotry中),不仅仅可以出触发hashchange事件,还会触发popstate事件(监听history对象变化的事件)

注意事项:


1. 如果改变的hash值与当前的hash值一致时,hashchang不会改变,但是popstate事件会执行(location.href更改时,执行,但是location.hash更改时,不会执行,两者执行时,都不会创建一条新的历史记录)。

2. 哪怕新的hash值和当前的hash值相同时,history.pushState方法会创建一条新的历史记录

更多内容,访问:

history
hash
单页面应用和多页面应用
React-Router源码分析-History库
History库源码分析-Action 动作类型
History库源码分析-createLocation
History库源码分析-createPath
History库源码分析-parsePath

相关推荐
天天向上杰9 天前
浅显易懂HashMap的数据结构
java·数据结构·算法·哈希算法·hashmap·hash
morris1311 个月前
【redis】数据类型之hash
数据库·redis·缓存·hash·哈希
bsr19831 个月前
前端路由的hash模式和history模式
前端·history·hash·路由模式
lally.2 个月前
密码学课程实验作业
密码学·des·mac·命令行·hash·rsa
东风点点吹3 个月前
HASH256开源代码计算错误问题
c语言·hash
程序猿-瑞瑞4 个月前
09 go语言(golang) - 数据类型:哈希表(map)及原理(一)
golang·散列表·hash
DieSnowK5 个月前
[Redis][Hash]详细讲解
redis·分布式·缓存·hash·使用场景·新手向·redis数据类型
安於宿命6 个月前
【C++进阶】hash表的封装
开发语言·c++·容器·hash
梦起丶6 个月前
Qt 中实现异步散列器
c++·qt·hash·qml
kidding7236 个月前
前端的面试题
前端·前端框架·vue-router·history·hash·abstract·v-bind