详解升级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图片滚动与幻灯片的实例代码
Apr 08 Javascript
js获取php变量的实现代码
Aug 10 Javascript
jQuery 回调函数(callback)的使用和基础
Feb 26 Javascript
jQuery对象初始化的传参方式
Feb 26 Javascript
JavaScript必看小技巧(必看)
Jun 07 Javascript
JS触摸与手势事件详解
May 09 Javascript
用js屏蔽被http劫持的浮动广告实现方法
Aug 10 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
Jan 13 Javascript
vue二级菜单导航点击选中事件的方法
Sep 12 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
Jun 28 Javascript
更强大的vue ssr实现预取数据的方式
Jul 19 Javascript
vue项目中使用rem,在入口文件添加内容操作
Nov 11 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与SQL注入攻击[二]
2007/04/17 PHP
php 清除网页病毒的方法
2008/12/05 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
异步JS框架的作用以及实现方法
2015/10/29 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
2018/06/30 Javascript
JS使用new操作符创建对象的方法分析
2019/05/30 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
[02:40]2018年度DOTA2最佳新人-完美盛典
2018/12/16 DOTA
Python的面向对象思想分析
2015/01/14 Python
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
Python装饰器知识点补充
2018/05/28 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
keras.layer.input()用法说明
2020/06/16 Python
python3 简单实现组合设计模式
2020/07/02 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
canvas实现圆绘制的示例代码
2019/09/11 HTML / CSS
HTML5图片预览实例分享
2014/06/04 HTML / CSS
世界上最大的二手相机店:KEN
2017/05/17 全球购物
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
上班睡觉检讨书
2014/01/09 职场文书
好邻里事迹材料
2014/01/16 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
小学运动会加油词
2015/07/18 职场文书
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫