react-router中history
目前, 1. react-router的依赖基础 – history1.1 History的整体介绍history 是一个独立的第三方js库,可以用来兼容在不同浏览器、不同环境下对历史记录的管理,拥有统一的API。具体来说里面的history分为三类:
上面针对不同的环境提供了三个API,但是三个API有一些共性的操作,将其抽象了一个公共的文件 // 内部的抽象实现 function createHistory(options={}) { ... return { listenBefore,// 内部的hook机制,可以在location发生变化前执行某些行为,AOP的实现 listen,// location发生改变时触发回调 transitionTo,// 执行location的改变 push,// 改变location replace,go,goBack,goForward,createKey,// 创建location的key,用于唯一标示该location,是随机生成的 createPath,createHref,createLocation,// 创建location } } 上述这些方式是history内部最基础的方法, function createLocation() { return { pathname,// url的基本路径 search,// 查询字段 hash,// url中的hash值 state,// url对应的state字段 action,// 分为 push、replace、pop三种 key // 生成方法为: Math.random().toString(36).substr(2,length) } } 1.2 内部解析三个API的大致的技术实现如下:
1.2.1 执行URL前进
伪代码实现如下: // createBrowserHistory(HTML5)中的前进实现 function finishTransition(location) { ... const historyState = { key }; ... if (location.action === 'PUSH') ) { window.history.pushState(historyState,null,path); } else { window.history.replaceState(historyState,path) } } // createHashHistory的内部实现 function finishTransition(location) { ... if (location.action === 'PUSH') ) { window.location.hash = path; } else { window.location.replace( window.location.pathname + window.location.search + '#' + path ); } } // createMemoryHistory的内部实现 entries = []; function finishTransition(location) { ... switch (location.action) { case 'PUSH': entries.push(location); break; case 'REPLACE': entries[current] = location; break; } } 1.2.2 检测URL回退
伪代码实现如下: // createBrowserHistory(HTML5)中的后退检测 function startPopStateListener({ transitionTo }) { function popStateListener(event) { ... transitionTo( getCurrentLocation(event.state) ); } addEventListener(window,'popstate',popStateListener); ... } // createHashHistory的后退检测 function startPopStateListener({ transitionTo }) { function hashChangeListener(event) { ... transitionTo( getCurrentLocation(event.state) ); } addEventListener(window,'hashchange',hashChangeListener); ... } // createMemoryHistory的内部实现 function go(n) { if (n) { ... current += n; const currentLocation = getCurrentLocation(); // change action to POP history.transitionTo({ ...currentLocation,action: POP }); } } 1.2.3 state的存储为了维护state的状态,将其存储在sessionStorage里面: // createBrowserHistory/createHashHistory中state的存储 function saveState(key,state) { ... window.sessionStorage.setItem(createKey(key),JSON.stringify(state)); } function readState(key) { ... json = window.sessionStorage.getItem(createKey(key)); return JSON.parse(json); } // createMemoryHistory仅仅在内存中,所以操作比较简单 const storage = createStateStorage(entries); // storage = {entry.key: entry.state} function saveState(key,state) { storage[key] = state } function readState(key) { return storage[key] } 2. react-router的基本原理一句话:实现URL与UI界面的同步。其中在react-router中, 3. react-router的具体实现react-router在 3.1 组件层面描述具体实现过程在 3.2 API层面描述具体实现过程为了简单说明,只描述使用browserHistory的实现,hashHistory的实现过程是类似的,就不在说明。 4. 结语目前
当然 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |