路由中history模式和hash模式的区别(附带大厂面试题)

文章介绍了Vue-Router的两种主要路由模式:Hash模式利用onhashchange事件监听URL变化,不重新请求页面;History模式借助history.pushStateAPI改变URL而不刷新页面。这两种模式都是为了在单页面应用中实现路由切换,而URL变化不导致页面刷新。
摘要由CSDN通过智能技术生成

前言

当浏览器url地址变化,浏览器都会根据url来请求相对应的html文件,当访问一个不存在的html文件就会报404错误。那么像vue这种单页面就是通过vue-router实现的路由切换
下面介绍一下vue-router的两种模式以及原理

hash模式

http://127.0.0.1:5500/hash-router.html#/about #后面的内容变化后,浏览器是不会再次请求的。然后通过监听onhashchange事件即可。
下面是简单的例子

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

  <style>
    .main {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      height: 100vh;
    }

    .index {
      display: none;
      background-color: bisque;
    }

    .about {
      display: none;
      background-color: brown;
    }
  </style>
</head>

<body>
  <div class="main">
    <div class="nav">
      <a href="#/index">首页</a>
      |
      <a href="#/about">关于</a>
    </div>
    <div class="content">
      <div class="index">
        <h1>首页</h1>
      </div>
      <div class="about">
        <h1>关于</h1>
      </div>
    </div>
  </div>

  <script>
    window.onhashchange = (e) => {
      const newURL = e.newURL.split('#/')[1]
      const oldURL = e.oldURL.split('#/')[1]
      document.querySelector(`.${oldURL}`).style.display = 'none'
      document.querySelector(`.${newURL}`).style.display = 'block'
    }
  </script>

</body>

</html>

history模式

http://127.0.0.1:5500/history-router.html,history模式的url就正常多了,那么url改变后,单页面应用是如何做到不重新请求呢?就是通过history.pushState()api实现的。

history.pushState() api 具体使用

例子:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

  <style>
    .main {
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      height: 100vh;
    }

    .index {
      display: none;
      background-color: bisque;
    }

    .about {
      display: none;
      background-color: brown;
    }
  </style>
</head>

<body>
  <div class="main">
    <div class="nav">
      <a href="javascript:jump('index')">首页</a>
      |
      <a href="javascript:jump('about')">关于</a>
    </div>
    <div class="content">
      <div class="index">
        <h1>首页</h1>
      </div>
      <div class="about">
        <h1>关于</h1>
      </div>
    </div>
  </div>

  <script>
    function jump(url) {
      history.pushState(null, null, `/${url}`)
      let pages = document.querySelectorAll('.content > div')
      pages.forEach((page) => {
        page.style.display = 'none'
      })
      document.querySelector(`.${url}`).style.display = 'block'
    }
  </script>

</body>

</html>

面试题

  • Vue-Router如何保证URL变化了,页面不会刷新?

因为Vue-Router使用的是history和hash模式

  • hash模式通过onhashchange监听hash值得变化
    history模式通过state来处理(history.pushState / replaceState / popState)
  • 后端能拿到URL所有信息吗

不可以。URL信息只在前端可见,Vue-Router通过修改浏览器的URL来管理页面导航,而不是每个页面都像后端请求
当然你可以前端获取url信息,通过参数传递给后端。

  • hash是不会导致页面刷新的,那前端是如何拿到hash信息的你知道吗

通过监听hashChange事件

小结

单页面应用实现路由主要有两种方案:

  1. onhashchange监听hash值变化
  2. history.pushState改变url,但不会刷新页面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰镇白干

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值