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 不会。不过这一点问题不大,我们可以通过自定义事件和全局事件总线来手动触发事件