概述

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的更多相关文章

  1. 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_ ...

  2. react-router 从 v2/v3 to v4 迁移(翻译)

    react-router v4 是完全重写的,所以没有简单的迁移方式,这份指南将为您提供一些步骤,以帮助您了解如何升级应用程序. 注意: 这份迁移指南适用于react-router v2和v3,但为简 ...

  3. GoogLeNet 之 Inception v1 v2 v3 v4

    论文地址 Inception V1 :Going Deeper with Convolutions Inception-v2 :Batch Normalization: Accelerating De ...

  4. 从Inception v1,v2,v3,v4,RexNeXt到Xception再到MobileNets,ShuffleNet,MobileNetV2

    from:https://blog.csdn.net/qq_14845119/article/details/73648100 Inception v1的网络,主要提出了Inceptionmodule ...

  5. 51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

    Bash游戏V1 有一堆石子共同拥有N个. A B两个人轮流拿.A先拿.每次最少拿1颗.最多拿K颗.拿到最后1颗石子的人获胜.如果A B都很聪明,拿石子的过程中不会出现失误.给出N和K,问最后谁能赢得 ...

  6. 魔方NewLife.Cube升级v2.0

    魔方是一套集成权限管理的MVC管理后台,最具特色功能是模版覆盖机制,是XCode实体类的最佳搭档! v2.0.2017.1126   借助Ajax支持高级操作,如:删除选中.批量启用禁用等 用户管理增 ...

  7. 信驰达蓝牙4.0模块全面升级 v2.20 U最新发布

    作为国际蓝牙联盟成员之一,德州仪器(TI)于2012年强势推出CC254X系列单芯片(SOC)低功耗蓝牙收发器,经典51内核,最强优势在于丰富的外围(21个IO,UART,SPI,USB2.0,PWM ...

  8. td-agent的v2,v3,v4版本区别

    官方地址:https://docs.fluentd.org/quickstart/td-agent-v2-vs-v3-vs-v4

  9. react-router v4 路由规则解析

    前言 react-router升级到4之后,跟前面版本比有了很大的差别. 例如包的拆分,动态路由等详细的差别就不说了,各位大神的总结也很到位,详细可以点击看看,All About React Rout ...

随机推荐

  1. WPF数据爬取小工具-某宝推广位批量生成,及订单爬取 记:接单最痛一次的感悟

    项目由来:上月闲来无事接到接到一个单子,自动登录 X宝平台,然后重定向到指定页面批量生成推广位信息:与此同时自动定时同步订单数据到需求提供方的Java服务. 当然期间遇到一个小小的问题就是界面样式的问 ...

  2. RequireJS跨域加载html模版后被转成JS问题分析及解决

    问题描述 RequireJS跨域加载HTML模版失败,例如: 在a.com域名下请求CDN域名下的模版,text.js插件会把html文件转成html.js文件去加载,由于并没有生成html.js文件 ...

  3. centos 6.8 安装git 报错

    报错信息: Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl               ...

  4. nginx做代理离线下载插件

    一.背景 被安装的服务器不能上网,无法下载插件,一个插件都还好,但是遇到插件依赖很强的需要几十个插件的依赖,这样就很麻烦. 二.环境 192.168.182.155     安装nginx     能 ...

  5. 在vs.net 2010,2015 等版本,给JS函数添加代码提示\注释

    经常编写JS的朋友常常会因为函数写多了,隔一段时间就会忘记了函数的用途,或者函数里带的参数作用情况,这个时候会联想到VS工具里的强大提示功能,多希望也能在JS上实现呀,告诉你,这个想法并不是多难,VS ...

  6. day 67 orm初识 {code_first/db_first}

    1,我们是先创建一个django项目,要同时把app带上, 然后再django项目里面把settings部分设置好,按照我们一开始创建django项目的时候设置的那些,csrf以及templates还 ...

  7. javaNIO的总结

    放大1.5倍查看 使用NIO对文件进行COPY操作 public class TestNIOCopyFile { public static void main(String[] args) thro ...

  8. Gson的两种实例化方式:

    2018-11-13   09:21:44 Gson的两种实例化方式: 1: 使用new Gson(); 普通实例化方式,不能配置定制化选项 Gson gson = new Gson(); 2: 通过 ...

  9. TensorFlow卷积层-函数

    函数1:tf.nn.conv2d是TensorFlow里面实现卷积的函数,实际上这是搭建卷积神经网络比较核心的一个方法 函数原型: tf.nn.conv2d(input,filter,strides, ...

  10. Flume配置文件写法总结

    一.agent 第一步是定义agent(代理)及agent下的sources.channels.sinks的简称,如下: a1.sources = r1 a1.sinks = k1 a1.channe ...