精通react之react-router4源码分析(100代码实现router功能)
1、react-router4
是一个 react 组件
通过和 location / histroy 结合,来显示页面不同URL对应显示不同的组件
其中包含了三种路由。hash / boswer 等
2、react-router基本原理
要对 history 进行解析和封装
要对 history/location 的改变进行监听
当 history/locaiton 改变触发 组件的路由检测
最后对应的渲染匹配的组件
3、实现
根据以上的分析。
我们可以开始实现基础模型代码
创建要给 Router.js 组件
this.state = {
children: null
}
// 这里是我们要渲染的子组件
// 匹配好的组件组装后显示
componentWillMount() {
let {children} = this.props
const {pathnpame} = window.location
children = this.checkRouter(children, pathname)
this.setState({
children
})
}
// 因为是模型代码
// 所以我之写初次进入的代码
// 在这里我们拦截 componentWillMount
// 根据 pathnpame ,children 实现检测和匹配
// checkRouter 匹配检测函数
function checkRouter(childrens, pathname) {
childrens.forEach((item, index) => {
const {props, type} = item
if (Object.prototype.toString.call(type) == '[object Function]' && type.name == 'Route') {
let {extra, path, children} = props
console.log(item)
if (path !== pathname && !extra) {
childrens[index].props.children= null
} else {
if (new RegExp(`^${path}`).test(pathname)) {
let {children} = props
if (Object.prototype.toString.call(children) == '[object Array]') {
childrens[index].props.children = checkRouter(children, pathname)
}
} else {
childrens[index].props.children= null
}
}
} else {
let {children} = props
if (Object.prototype.toString.call(children) == '[object Array]') {
childrens[index].props.children = checkRouter(children, pathname)
}
}
})
return childrens
}
// 这里是匹配具体的规则
// 代码不多,自己理解吧
在创建一个 route.js
route.js 只要实现返回 子组件就 OK 了
4、调用
<Router>
<div>1</div>
<Text>
<div>3</div>
<Route path='/test2'>7</Route>
</Text>
<Route path='/test'>4</Route>
<Route extra path='/switch'>
<div>2</div>
<Route path='/switch/one'>5</Route>
<Route path='/switch/two'>
<div>6</div>
</Route>
</Route>
</Router>
5、完成
有什么问题可以留言回复哦!!!
精通react之react-router4源码分析(100代码实现router功能)的更多相关文章
- React事件杂记及源码分析
前提 最近通过阅读React官方文档的事件模块,发现了其主要提到了以下三个点 调用方法时需要手动绑定this React事件是一种合成事件SyntheticEvent,什么是合成事件? 事件属性 ...
- Hadoop RCFile存储格式详解(源码分析、代码示例)
RCFile RCFile全称Record Columnar File,列式记录文件,是一种类似于SequenceFile的键值对(Key/Value Pairs)数据文件. 关键词:Reco ...
- 源码分析 | 手写mybait-spring核心功能(干货好文一次学会工厂bean、类代理、bean注册的使用)
作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言介绍 一个知识点的学习过程基本分为:运行helloworld ...
- Vue.js 源码分析(一) 代码结构
关于Vue vue是一个兴起的前端js库,是一个精简的MVVM.MVVM模式是由经典的软件架构MVC衍生来的,当View(视图层)变化时,会自动更新到ViewModel(视图模型),反之亦然,View ...
- jQuery 源码分析(一) 代码结构
jQuery是一个Javascript库,它支持链式操作方式,即对发生在同一个JQuery对象上的一组动作,可以直接接连写无需要重复获取对象.这一特点使得JQuery的代码无比优雅,而且有强大的选择器 ...
- 朴素贝叶斯算法源码分析及代码实战【python sklearn/spark ML】
一.简介 贝叶斯定理是关于随机事件A和事件B的条件概率的一个定理.通常在事件A发生的前提下事件B发生的概率,与在事件B发生的前提下事件A发生的概率是不一致的.然而,这两者之间有确定的关系,贝叶斯定理就 ...
- Java入门到精通——框架篇之Spring源码分析Spring两大核心类
一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.spri ...
- jquery1.7.2的源码分析(六)基本功能
jQuery.fn.extend({ attr: function( name, value ) { return jQuery.access( this, jQuery.attr, name, va ...
- epoll源码分析(基于linux-5.1.4)
API epoll提供给用户进程的接口有如下四个,本文基于linux-5.1.4源码详细分析每个API具体做了啥工作,通过UML时序图理清内核内部的函数调用关系. int epoll_create1( ...
随机推荐
- SC CSP-J2019初赛成绩已出!
链接: https://pan.baidu.com/s/1UK2pL7UW0n0vYpnzMbJm9A 提取码: uwav 复制这段内容后打开百度网盘手机App,操作更方便哦 Me?87! I am ...
- EasyExcel引入
好久没更了,都在有道云上面记录,没时间搬过来. easyexcel是最近项目做优化涉及的一个改善点吧. 简介 导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个 ...
- UFUN函数 UF_CSYS UF_MODL UF_OBJ函数(建模注意坐标系);
//用到的函数 //UF_MODL_create_block1 ,UF_MODL_ask_feat_body,UF_OBJ_set_name,UF_CSYS_map_point UF_initiali ...
- learning shell check host dependent pkg
[Purpose] Shell script check host dependent pkg [Eevironment] Ubuntu 16.04 bash env ...
- webstorm永久破解
准备 1. webstorm下载 本次使用的是2017.3.3版本,如果找不到那么在此附上:webstorm各版本下载地址. 前段时间有朋友反馈破解不成功,今天本人亲测2017.3.3仍可以破解成功, ...
- hotspot的内存
java memory主要分heap memory 和 non-heap memory,其计算公式如下: Max memory = [-Xmx] + [-XX:MaxPermSize] + numbe ...
- [技术博客]利用第三方框架react-native-swipeout实现左右滑动出现按钮
在之前的开发中,为了实现用户不同手势操作能够对应不同的功能,我们考虑使用React-Native的API--PanResponder,实现识别用户的手势,实现不同的功能.但我们很快就发现,这样简单的实 ...
- 使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明【转】
原文链接:https://blog.csdn.net/Donjuan/article/details/3865026在网上看到很多网友在.NET程序中调用Win32 API,或者调用自己的VC DLL ...
- 配置IDEA项目JDK环境
打开IDEA,然后点击[Configure]->[Project Defaults]->[Project Structure],如下图: 然后左侧点击树形菜单的[Project Sett ...
- t6_sumdoc
C:\Users\Administrator\Documents\sumdoc 2019\sumdoc t6 final\sumdoc t615C:\Users\Administrator\Docum ...