全方位解析createBrowserHistory

发布时间:2023-05-19

一、介绍

React Router 是 React 之一重要的第三方库,它已经成为构建 Web 应用程序的标准方式。Browser history 对象是 React Router 将 URL 和 UI 同步的关键。从 version 6.0.0 开始,React Router 更换为了使用 createBrowserHistory 来创建 history 对象。本篇文章将从多个方面详细阐述 createBrowserHistory 相关内容。

二、createBrowserHistory 基础知识

createBrowserHistory 实际上创建了一个 history 对象,对传统 HTML5 History API 进行了封装。history 对象是一个 JavaScript 对象,提供了对 window 的 history 调用的封装。我们可以使用在 React Router 中使用该对象来将 URL 和 UI 保持同步。

三、createBrowserHistory 代码演示

import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
history.push('/home'); 
history.goBack();

以上代码演示了如何使用 createBrowserHistory 来创建 history 对象,并如何使用这个对象来更新 URL。可以看到,通过使用 history.push('/home') 函数,我们可以将 URL 更新为 /home。而 history.goBack() 函数可以将用户前往上一个页面。

四、createBrowserHistory 参数

createBrowserHistory 支持传递参数来更细粒度地控制 history 对象的行为。下面是部分常用的参数:

4.1 forceRefresh

import { createBrowserHistory } from 'history';
const history = createBrowserHistory({forceRefresh:true});

forceRefresh (boolean):如果设置为 true,当 history 发现 URL 和当前的 URL 不同,它将导致页面重新加载。这与 window.location = url 所具有的相同的行为。

4.2 basename

import { createBrowserHistory } from 'history';
const history = createBrowserHistory({basename:'/myapp'});

basename (string):basename 能够让所有的 location.pathname 前缀被忽略。举个例子,如果你正在 /myapp 路径下使用该 history,那么您的代码不需要知道它,因为所有的 URL 都将与 /myapp 前缀相匹配。

4.3 hashType

import { createBrowserHistory } from 'history';
const history = createBrowserHistory({hashType:'slash'});

hashType (string):hashType 消除哈希前缀和路径前缀之间的混淆,接受两个值:slashnoslash。当使用 slash 时,路径是从 / 开始的,并且不包含哈希符号。而在使用 noslash 时,则是路径去掉第一个斜杠,并包含哈希符号。

五、createBrowserHistory 实现原理

history 对象是 createBrowserHistory 函数的返回值,该函数内部采用了 HTML5 History API 提供的 pushStatereplaceStatepopstate 三个 API 来实现页面跳转和 history 对象的状态修改。 该函数还包含一些 otherFunctions,其中最常用的两个是 blocklisten。它们用于阻止 add、delete、update 这些操作,和监听当前 URL 的变化。在其他的 React 组件中,我们可以使用路由钩子通过 block 函数来拦截导航。这样一来的话,currentLocation 就代替了 history 的行为。

六、总结

createBrowserHistory 函数是实现 React Router 4 的必要条件之一。它是 React Router 库建立在 HTML5 History API 之上的封装器。同时,使用 createBrowserHistory 可以对应用程序行为进行细粒度的控制,实现用户友好的页面转换。