深入理解react-router 路由的实现原理
React Router 是一个基于 React 之上的强大路由库,它可以让你向应用中快速地添加视图和数据流,保持页面与 URL 间的同步。本文从两个方便来解析 react-router 实现原理。一介绍 react-router 的依赖库history;二使用 history 库,实现一个简单的 react-router 路由。
history 介绍
history 是一个 JavaScript 库,可让您在 JavaScript 运行的任何地方轻松管理会话历史记录。history 抽象出各种环境中的差异,并提供最小的 API ,使您可以管理历史堆栈,导航,确认导航以及在会话之间保持状态。
history 有三种实现方式
1、BrowserHistory用于支持 HTML5 历史记录 API 的现代 Web 浏览器(请参阅跨浏览器兼容性)
2、HashHistory用于旧版Web浏览器
3、MemoryHistory用作参考实现,也可用于非 DOM 环境,如 React Native 或测试
三种实现方法,都是创建了一个 history 对象,这里主要讲下前面两种
const history = { length: globalHistory.length, action: "POP", location: initialLocation, createHref, push, // 改变location replace, go, goBack, goForward, block, listen //监听路由变化 };
1.页面跳转实现
BrowserHistorypushState、replaceState;
HashHistorylocation.hash、location.replace
function push(){ createKey(); // 创建location的key,用于唯一标示该location,是随机生成的 if(BrowserHistory){ globalHistory.pushState({ key, state }, null, href); }else if(HashHistory){ window.location.hash = path; } //上报listener 更新state ... } function replace(){ createKey(); // 创建location的key,用于唯一标示该location,是随机生成的 if(BrowserHistory){ globalHistory.replaceState({ key, state }, null, href); }else if(HashHistory){ window.location.replace(window.location.href.slice(0, hashIndex >= 0 ? hashIndex : 0) + "#" path); } //上报listener 更新state ... }
2.浏览器回退
BrowserHistorypopstate;
HashHistoryhashchang;
if(BrowserHistory){ window.addEventListener("popstate", routerChange); }else if(HashHistory){ window.addEventListener("hashchange", routerChange); } function routerChange(){ const location = getDOMLocation(); //获取location //路由切换 transitionManager.confirmTransitionTo(location,callback=()=>{ //上报listener transitionManager.notifyListeners(); }); }
通过 history 实现简单 react-router
import { Component } from 'react'; import createHistory from 'history/createHashHistory'; const history = createHistory(); //创建 history 对象 / 配置路由表 @type {{"/": string}} / const router = { '/': 'page/home/index', '/my': 'page/my/index' } export default class Router extends Component { state = { page: null } async route(location) { let pathname = location.pathname; let pagePath = router[pathname]; // 加 ./的原因 https://webpack.docschina./api/module-methods#import- const Page = await import(`./${pagePath}`); //获取路由对应的ui //设置ui this.setState({ Page: Page.default }); } initListener(){ //监听路由切换 history.listen((location, action) => { //切换路由后,更新ui this.route(location); }); } ponentDidMount() { this.route(history.location); this.initListener(); } render() { const { Page } = this.state; return Page && <Page {...this.props} />; } }
目前react-router在项目中已有大量实践,其优点可以如下:
风格: 与React融为一体,专为react量身打造,编码风格与react保持一致,例如路由的配置可以通过ponent来实现
简单: 不需要手工维护路由state,使代码变得简单
强大: 强大的路由管理机制,体现在如下方面
- 路由配置: 可以通过组件、配置对象来进行路由的配置
- 路由切换: 可以通过<Link> Redirect进行路由的切换
- 路由加载: 可以同步记载,也可以异步加载,这样就可以实现按需加载
使用方式: 不仅可以在浏览器端的使用,而且可以在服务器端的使用
react-router的缺点就是API不太稳定,在升级版本的时候需要进行代码变动。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程