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

相关推荐
程序猿-瑞瑞13 天前
09 go语言(golang) - 数据类型:哈希表(map)及原理(一)
golang·散列表·hash
DieSnowK2 个月前
[Redis][Hash]详细讲解
redis·分布式·缓存·hash·使用场景·新手向·redis数据类型
安於宿命2 个月前
【C++进阶】hash表的封装
开发语言·c++·容器·hash
梦起丶2 个月前
Qt 中实现异步散列器
c++·qt·hash·qml
kidding7232 个月前
前端的面试题
前端·前端框架·vue-router·history·hash·abstract·v-bind
胜天半月子3 个月前
redis | 认识非关系型数据库Redis的哈希数据类型
redis·nosql·hash
宋发元3 个月前
哈希表(Hash Table)
服务器·hash·哈希表·hash table
禅思院4 个月前
history,hash缓存那些事
算法·缓存·哈希算法·history·hash·页面缓存
我想学LINUX4 个月前
【常见开源库的二次开发】基于openssl的加密与解密——单向散列函数(四)
linux·算法·哈希算法·hash·数字签名·md5算法·单项列表函数
桀桀桀桀桀桀4 个月前
Hash表(C++)
c++·算法·哈希算法·hash