精通react之react-router4源码分析(100代码实现router功能)
2024-10-12 20:18:40
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、完成
有什么问题可以留言回复哦!!!
最新文章
- windows系统和ubuntu虚拟机之间文件共享——samba
- yii框架详解 之 CActiveRecord
- 关于plsql连接oracle数据库session失效时间设置
- 我是如何使用git的
- nova help network-create
- 一起刑事案件法庭辩护 z
- jQuery学习笔记(1)
- 学习jax-ws(一)
- HDU 5752 Sqrt Bo (数论)
- bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
- java String对象的创建(jvm).
- 【C#网络基础】C# get post请求
- mysql to sql sersver
- css背景渐变兼容(兼容所有ie)
- QPointer很大程度上避免了野指针(使用if语句判断即可,类似于dynamic_cast),而且使用非常方便 good
- IEcss样式,行高的问题
- css-dialog样式实现弹框蒙层全屏无需JS计算高度兼容IE7
- 机器学习:Python实现聚类算法(一)之K-Means
- Android———最详细的系统对话框使用
- 利用axure软件实现app中的轮播图功能