Open haizhilin2013 opened 5 years ago
依赖 history 库,保证视图和 URL 的同步
用户可以通过手动输入或者与页面进行交互来改变 URL,然后向服务端发送请求获取资源,成功后重新绘制 UI。
1.react-router依赖基础 - history,是一个独立的第三方js库,可以用来兼容在不同浏览器、不同环境下对历史记录的管理,拥有统一的API。具体来说里面的history分为三类:
createHashHistory()
createBrowserHistory()
createMemoryHistory()
*createHashHistory、createBrowserHistory、createMemoryHistory方法只是覆盖了某些基础公用方法,比如go(),replace(),push()等。BrowserRouter和HashRouter组件,前者使用pushState和popState事件构建路由,后者使用 hash 和 hashchange 事件构建路由。MemeoryRouter可以应用于像react native。
两部分来说: 客户端路由实现的思想:
hashchange
事件,感知 hash 的变化
history.go()
等 APIvar _wr = function(type) {
var orig = history[type];
return function() {
var rv = orig.apply(this, arguments);
var e = new Event(type);
e.arguments = arguments;
window.dispatchEvent(e);
return rv;
};
};
history.pushState = _wr('pushState');
history.replaceState = _wr('replaceState');
上面代码在调用 pushState 的时候回同步 dispatch 一个 pushState
事件,可以监听感知
react-router 实现的思想:
history
库来实现上述不同的客户端路由实现思想,并且能够保存历史记录等,磨平浏览器差异,上层无感知
[react] React-Router的实现原理是什么?