ReactRouter升级 v2 to v4
概述
react-router V4 相对于react-router V2 or V3 几乎是重写了, 新版的react-router更偏向于组件化(everything is component)。
V4
汲取了很多思想,路由即是组件,使路由更具声明式,且方便组合。如果你习惯使用react
,那么一定会很快上手新版的react-router
。
react-router V4 被一分为三: react-router-dom
(for web)、react-router-native
(for native)、react-router
(core)。但如果仅在浏览器中使用的话,一般只需要用到react-router-dom
就可以了。
改动点
1. Router/Route 的改变
// V2 or V3
import { Router, Route, hashHistory } from 'react-router';
<Router history={hashHistory}>
<Route path='/foo' component={Foo} />
<Route path='/bar' component={Bar} />
</Router>
// V4 Router组件里只能渲染一个组件
import {
HashRouter as Router,
Route
} from 'react-router-dom';
<Router>
<div>
<Route path='/foo' component={Foo} />
<Route path='/bar' component={Bar} />
</div>
</Router>
2. 组件嵌套
// V2 or V3 路由组件嵌套
import { Router, Route, hashHistory } from 'react-router';
<Router history={hashHistory}>
<Route path='/' component={App}>
<Route path='foo' component={Foo} />
<Route path='bar' component={Bar} />
</Route>
</Router>
// V4 Router 的路由组件嵌套
import {
HashRouter as Router,
Route,
Switch
} from 'react-router-dom';
<Router>
<Route path="/" component={(props) => (
<App {...props}>
<Switch>
<Route path='/foo' component={Foo} />
<Route path='/bar' component={Bar} />
</Switch>
</App>
)}/>
</Router>
3. 路由的生命周期
在react-router V4
中去掉了on****
的路由生命周期的钩子,但是你可以在组件中用componentDidMount
或 componentWillMount
代替 onEnter
,可以用componentWillUpdate
或 componentWillReceiveProps
代替 onUpdate
,你可以用componentWillUnmount
代替 onLeave
。
4. Link
// V2 or V3
import { Link } from 'react-router';
// V4
import { Link } from 'react-router-dom';
5. history.push and history.replace
// V2 or V3
history.push({
pathname: '/home',
query: {
foo: 'test',
bar: 'temp'
}
});
history.replace({
pathname: '/home',
query: {
foo: 'test',
bar: 'temp'
}
});
// V4
history.push({
pathname: '/home',
search: '?foo=test&bar=temp',
});
history.replace({
pathname: '/home',
search: '?foo=test&bar=temp',
});
6. props.params
// V2 or V3 获取params可以这么获取
this.props.params
// V4
this.props.match.params
7. location.query
// V2 or V3 获取query可以这么获取
this.props.location.query
// V4 去掉了location.query,只能使用search来获取,为了让其跟浏览器一样
// 如果想要兼容以前的location.query,可以使用query-string库解析一下
// 如: queryString.parse(props.location.search)
this.props.location.search
8. location.action
// V2 or V3 获取location的action
this.props.location.action
// V4 去掉了location.action, 放在了history里面
history.action
9.关于history
以前获取react-router里面的history库,可以这么获取:
import {hashHistory as history} from 'react-router';
react-router V4:
import createHashHistory as history from 'history/createHashHistory';
兼容处理
因为要从react-router V2
完全迁移到react-router V4
工作量还是挺大的,一下子难以完全迁移,所以对某些地方做了兼容处理。
history
import _ from 'lodash';
import queryString from 'query-string';
function processHistory(history) {
const _push = history.push;
const _replace = history.replace;
history.push = function (one) {
if (!_.isPlainObject(one)) {
return _push.apply(this, arguments);
}
const o = Object.assign({}, one);
if (o.query) {
o.search = queryString.stringify(o.query);
}
_push.apply(this, [o]);
};
history.replace = function (one) {
if (!_.isPlainObject(one)) {
return _replace.apply(this, arguments);
}
const o = Object.assign({}, one);
if (o.query) {
o.search = queryString.stringify(o.query);
}
_replace.apply(this, [o]);
};
return history;
}
export default processHistory;
props
import queryString from 'query-string';
const processReactRouterProps = (props) => {
const newProps = Object.assign({}, props);
newProps.location.query = queryString.parse(props.location.search);
newProps.location.action = newProps.history.action;
newProps.params = props.match.params || {}; // 不止 || 是否有意义
return newProps;
}
export default processReactRouterProps;
参考资料:
ReactRouter升级 v2 to v4的更多相关文章
- ubuntn 内核升级到LINUX v4.11.8:
升级到LINUX v4.11.8: http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.11.8/linux-headers-4.11.8-041108_ ...
- react-router 从 v2/v3 to v4 迁移(翻译)
react-router v4 是完全重写的,所以没有简单的迁移方式,这份指南将为您提供一些步骤,以帮助您了解如何升级应用程序. 注意: 这份迁移指南适用于react-router v2和v3,但为简 ...
- GoogLeNet 之 Inception v1 v2 v3 v4
论文地址 Inception V1 :Going Deeper with Convolutions Inception-v2 :Batch Normalization: Accelerating De ...
- 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2
from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule ...
- 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))
Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...
- 魔方NewLife.Cube升级v2.0
魔方是一套集成权限管理的MVC管理后台,最具特色功能是模版覆盖机制,是XCode实体类的最佳搭档! v2.0.2017.1126 借助Ajax支持高级操作,如:删除选中.批量启用禁用等 用户管理增 ...
- 信驰达蓝牙4.0模块全面升级 v2.20 U最新发布
作为国际蓝牙联盟成员之一,德州仪器(TI)于2012年强势推出CC254X系列单芯片(SOC)低功耗蓝牙收发器,经典51内核,最强优势在于丰富的外围(21个IO,UART,SPI,USB2.0,PWM ...
- td-agent的v2,v3,v4版本区别
官方地址:https://docs.fluentd.org/quickstart/td-agent-v2-vs-v3-vs-v4
- react-router v4 路由规则解析
前言 react-router升级到4之后,跟前面版本比有了很大的差别. 例如包的拆分,动态路由等详细的差别就不说了,各位大神的总结也很到位,详细可以点击看看,All About React Rout ...
随机推荐
- 【Android】Android 广播大全
[Android]Android 广播大全 String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式. String ALL_APPS_ACTION 动作:列举所有可用的应 ...
- Python_函数_参数
def 是函数的关键字,Python解释器一旦执行到def,默认不执行 def li(): n = 8 n +=1 print(n) li() li2 = li li2() 结果: 9 9 ret ...
- linux中查看http各种状态数量
转自: http://www.cnblogs.com/wayne173/p/5652043.html 我们的网站部署在linux的服务器上,特别是web服务器,我们可能有时候做为运维人员,肯定是要查看 ...
- 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1 ...
- 063 SparkStream数据接收方式
1.两种方式 2.Basic Source 由StreamingContext可以提供的API 上面做的wordcount中的方式就算是第一种方式. 3.Advanced Source 使用数据接收器 ...
- 第K人||约瑟夫环(链表)
http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4442 很容易超时 通过数组来记录,删除 //数组从1开始好像不行 后面一些数字就乱码了,因 ...
- HDU 4027 Can you answer these queries【线段树】
<题目链接> 题目大意: 给定一段序列,现在对指定区间进行两种操作:一是对指定区间进行修改,对其中的每个数字都开根号(开根号后的数字仍然取整):二是对指定区间进行查询,查询这段区间所有数字 ...
- JavaScript 六大类运算符(详细~)
运算符 1.算术运算符:+.-.*./.%.++.-- 单目(操作数为一个且为变量): i++.i--.++i.--i; 双目:+.-.*./.%; 双目其中 -*/% ...
- uni-app — 一套前端开发跨平台应用的终极解决方案
uni-app 是一个使用 Vue.js 开发跨平台应用的前端框架,开发者编写一套代码,可编译到iOS.Android.H5.小程序等多个平台. 今天有空就来介绍一下uni-app这个能够跨平台开发, ...
- vsftpd中配置文件详解
在vsftp服务器中,配置文件/etc/vsftpd/vsftpd.conf文件是配置的核心内容,其具体的配置信息详细情况如下: 1.默认配置: 1>允许匿名用户和本地用户登陆. anonymo ...