前端路由,hash模式与history模式

194 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前端路由,指由前端监听 URL 改变从而控制页面中组件渲染做到无刷新式页面跳转

hash 模式

hash 就是指 url 后的 **# 号以及后面的字符。** hash也称作锚点,本身是用来做页面定位的,他可以使对应的 id 元素显示在可视区域内。

hash 模式就是通过改变 URL 中 **# 号后面的 hash 值**来切换路由,在通过 **`hashchange`** 事件来监听 hash 的改变从而控制组件的渲染。

```js
function cb = (event) => {
    console.log(event.oldUrl, event.newUrl);
    let hash = location.hash; // 获得 hash 值,例如 #add
}
window.addEventListener("hashchange", cb)
```

hash 发生变化的 url 都会被浏览器记录下来,所以浏览器的前进后退都可以用了

history 模式

history 模式利用了 HTML5 中新增的 **`pushState` 和 `replaceState`** 两个方法。这两个方法应用于浏览器的历史记录栈,在当前已有的 historyAPI `back``forward``go` 的基础上,提供了**修改历史记录**的功能。

-   **`pushState(state, title, url)`**

    用来在浏览器历史中**添加记录**,但浏览器不会立刻向后端发送请求,**不会触发 `popstate` 事件**

-   **`replaceState(state, title, url)`**

    用来在浏览器历史中**修改记录**,但浏览器不会立刻向后端发送请求,**不会触发 `popstate` 事件**

    -   state:一个与指定网址相关的状态对象,**`popstate` 事件触发时,该对象会传入回调函数**。如果不需要这个对象,此处可以填null。
    -   title:新页面的标题,但是所有浏览器目前都忽略这个值,因此这里可以填null。
    -   url:新的网址,必须与当前页面处在同一个域(**不能跨域!!** )。浏览器的地址栏将显示这个网址。
 同时提供了一个 **`popstate`** 事件来监控路由改变,但并不像 `hashchange` 一样改变了就会触发


-   **`popstate` 事件**

    -   `pushState``replaceState` 事件不会触发 `popstate` 事件

    -   当同一个文档的浏览历史(即**history对象**)出现变化时,才会触发 `popstate` 事件

        -   通过浏览器前进后退改变了 URL 会触发
        -   JS 调用 historyAPI 的 `back``forward``go` 等方法会触发

    -   使用的时候,可以为 `popstate` 事件指定回调函数。这个回调函数的参数是一个 `event` 事件对象,它的 `state` 属性指向 `pushState``replaceState` 方法为**当前URL所提供的状态对象**(即这两个方法的第一个参数)

        ```js
        window.addEventListener('popstate', function(event) {
            console.log(event.state)
        })
        ```
  • hash 模式与 history 模式的区别

    • hash 模式下,仅 hash符号(#)之前的内容会被包含在请求中,如 www.11.com,因此对于后端来说,即使没有做到对路由的全覆盖,也不会返回404错误。
    • history 模式下,前端的 url 必须和实际后端发起请求的 url 一致,如www.222.com/aa/ 。如果后端缺少对 /aa/ 的路由处理,将返回404错误。此时需要在后端作出相应的调整(比如 nginx配置重定向)

最后

欢迎大家在评论区一起交流,一起进步!