详解升级react-router 4 踩坑指南


Posted in Javascript onAugust 14, 2017

一.前言

上午把近日用React做的一个新闻项目所依赖的包升级到了最新的版本,其中从react-router(2.8.1)升级到react-router(4.1.2)中出现了很多问题, 故总结一下在升级过程中遇到的问题.

二.react-router,V4版本修改内容

1. 所有组件更改为从react-router-dom导入

之前的所有路由组件均是从react-router中导入,在我之前的项目中,导入相关组件如下:

//v2
import {Router,Route,hashHistory} from 'react-router';

在react-router4 开始,所有的router组件均是从react-router-dom中导入, 所以一下的需要更改为以下代码:

//v4
import {Route,BrowserRouter, Switch} from 'react-router-dom';

细心的你发现在,到导入的过程中,我删除了Router,但是增加了BorwerRouter和Switch,下面我会一步步的说明.

2. 将所有<Router>替换为<BrowserRouter>

之前v2中的代码如下:

//v2
 <Router history={hashHistory}>
  <Route path="/" component={PCIndex}></Route>
  <Route path="/details/:uniqueky" component={PCNewsDetails}></Route>
  <Route path="/usercenter" component={PCUserCenter}></Route>
 </Router>

现在需要更改为BrowserRouter

//v4
<BrowserRouter>
  <Switch>
   <Route exact path="/" component={MobileIndex}></Route>
   <Route path="/details/:uniqueky" component={MobileNewsDetails}></Route>
   <Route path="/usercenter" component={MobileUserCenter}></Route>
  </Switch>
 </BrowserRouter>

细心的你发现,这里的代码不仅仅是将Router替换为BrowserRouter,而且还把所有的Route中用Switch包裹起来. 下面就是v4的另一个修改.

3. <BrowserRouter>只能有一个子节点

<BroserRouter>只能有一个子节点,所以官网建议的是使用<Switch>进行包裹,官网给出的例子如下.

In v3, you could specify a number of child routes, and only the first one that matched would be rendered.

// v3
<Route path='/' component={App}>
 <IndexRoute component={Home} />
 <Route path='about' component={About} />
 <Route path='contact' component={Contact} />
</Route>

v4 provides a similar functionality with the <Switch> component. When a <Switch> is rendered, it will only render the first child <Route> that matches the current location.

// v4
const App = () => (
 <Switch>
  <Route exact path='/' component={Home} />
  <Route path='/about' component={About} />
  <Route path='/contact' component={Contact} />
 </Switch>
)

4. 最坑的地方:在当前目录下的文件路径不再使用./, 而是直接用/.

在进行文件引用的时候 ,./src/js的写法需要更改文'/src/js', 这是更改之后最坑的地方!!! 因为其他的更改,在控制台都会有着详细的错误提示, 然而找不到文件只会出现404!!!
所以,在单页面中的引入的css文件和bundle.js的引入都需要更改, 在我的项目中的例子如下:

//v2
<!DOCTYPE html>
<html lang="en">
  <head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="./src/css/pc.css" rel="external nofollow" >
    <link rel="stylesheet" href="./src/css/mobile.css" rel="external nofollow" >
  </head>
  <body>
    <div id="mainContainer">
      
    </div>
    <script src="./src/bundle.js"></script>
  </body>
</html>

上面的页面需要更改为下面这样,否则所有的文件都无法找到:

//v4
<!DOCTYPE html>
<html lang="en">
  <head>
    <title></title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="/src/css/pc.css" rel="external nofollow" >
    <link rel="stylesheet" href="/src/css/mobile.css" rel="external nofollow" >
  </head>
  <body>
    <div id="mainContainer">
      
    </div>
    <script src="/src/bundle.js"></script>
  </body>
</html>

三.更多信息

以上就是我在我的项目中所遇到的坑,以及对应的处理办法.总的来说react-router4 rewrite之后变化还是挺大的.

1. 更多React-router v4的修改信息,请看Github:

Migrating from v2/v3 to v4

2. 本文中的项目下载地址:

Github: https://github.com/Lee-Tanghui/React-news-project.git

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery下操作HTML控件的实现代码
Jan 12 Javascript
ASP.NET中AJAX 调用实例代码
May 03 Javascript
深入理解javascript学习笔记(一) 编写高质量代码
Aug 09 Javascript
js函数的延迟加载实现代码
Oct 11 Javascript
基于jquery实现的文字淡入淡出效果
Nov 14 Javascript
5个可以帮你理解JavaScript核心闭包和作用域的小例子
Oct 08 Javascript
加载列表时jquery获取ul中第一个li的属性
Nov 02 Javascript
Vue Spa切换页面时更改标题的实例代码
Jul 15 Javascript
基于node.js之调试器详解
Aug 22 Javascript
Koa2微信公众号开发之消息管理
May 16 Javascript
Vue 进阶之路(三)
Apr 18 Javascript
解决微信小程序中的滚动穿透问题
Sep 16 Javascript
javaScript封装的各种写法
Aug 14 #Javascript
vue教程之toast弹框全局调用示例详解
Aug 24 #Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
Aug 14 #Javascript
jQuery实现手势解锁密码特效
Aug 14 #jQuery
Vue+Element使用富文本编辑器的示例代码
Aug 14 #Javascript
带你快速理解javascript中的事件模型
Aug 14 #Javascript
JS获取子、父、兄节点方法小结
Aug 14 #Javascript
You might like
php强制下载类型的实现代码
2011/04/21 PHP
PHP以mysqli方式连接类完整代码实例
2014/07/15 PHP
php隐藏IP地址后两位显示为星号的方法
2014/11/21 PHP
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
javascript快速排序算法详解
2014/09/17 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
2016/06/01 Javascript
jquery实现输入框实时输入触发事件代码
2016/12/21 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
vue-cli2.x项目优化之引入本地静态库文件的方法
2018/06/19 Javascript
webstorm中配置Eslint的两种方式及差异比较详解
2018/10/19 Javascript
openlayers4.6.5实现距离量测和面积量测
2020/09/25 Javascript
编写Python脚本来获取Google搜索结果的示例
2015/05/04 Python
Python heapq使用详解及实例代码
2017/01/25 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
Python之列表的插入&amp;替换修改方法
2018/06/28 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
2018/10/11 Python
使用numba对Python运算加速的方法
2018/10/15 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
Python异步操作MySQL示例【使用aiomysql】
2019/05/16 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
Python中正反斜杠(‘/’和‘\’)的意义与用法
2019/08/12 Python
利用4行Python代码监测每一行程序的运行时间和空间消耗
2020/04/22 Python
如何在Python对Excel进行读取
2020/06/04 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
python字典与json转换的方法总结
2020/12/28 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
初婚未育证明
2014/01/15 职场文书
违纪检讨书2000字
2014/02/08 职场文书
整改落实自查报告
2014/11/05 职场文书
未婚证明范本
2015/06/15 职场文书
配置nginx负载均衡
2022/05/06 Servers