React-Router

294 阅读1分钟

React-Router 是 React 场景下的路由解决方案

路由器:BrowserRouter 和 HashRouter 路由器负责感知路由的变化并作出反应,它是整个路由系统中最为重要的一环。React-Router 支持我们使用 hash(对应 HashRouter)和 browser(对应 BrowserRouter) 两种路由规则

两者使用方法一致,区别在于底层调用的实例化方法:

HashRouter 调用了 createHashHistory,BrowserRouter 调用了 createBrowserHistory

  • createBrowserHistory:它将在浏览器中使用 HTML5 history API 来处理 URL它能够处理形如这样的 URL: example.com/some/path。 由此可得,BrowserRouter 是使用 HTML 5 的 history API 来控制路由跳转的
  • createHashHistory:它是使用 hash tag (#) 处理 URL 的方法,能够处理形如这样的 URL: example.com/#/some/path。

实现原理:

  • HashRouter通过hashChange时间监听hash的改变,用window.location.hash来修改hash
  • HistoryRouter:HTML4给我们提供的history的能力有
window.history.forward()  // 前进到下一页
window.history.back() // 后退到上一页
window.history.go(2) // 前进两页
window.history.go(-2) // 后退两页

从HTML5开始,提供了新的两个API

history.pushState(data[,title][,url]); // 向浏览历史中追加一条记录
history.replaceState(data[,title][,url]); // 修改(替换)当前页在浏览历史中的信息

在 history 模式下,我们可以通过监听 popstate 事件来达到我们的目的:

window.addEventListener('popstate', function(e) {
  console.log(e)
});

每当浏览历史发生变化,popstate 事件都会被触发。

go、forward 和 back 等方法的调用确实会触发 popstate,但是pushState 和 replaceState 不会。不过这一点问题不大,我们可以通过自定义事件和全局事件总线来手动触发事件