详解升级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 相关文章推荐
javascript实现上传图片前的预览(TX的面试题)
Aug 20 Javascript
AJAX 网页保留浏览器前进后退等功能
Feb 12 Javascript
javascript时间函数基础介绍
Mar 28 Javascript
Jquery和Js获得元素标签名称的方法总结
Oct 08 Javascript
老生常谈原生JS执行环境与作用域
Nov 22 Javascript
javascript中闭包概念与用法深入理解
Dec 15 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
May 25 Javascript
原生JS+Canvas实现五子棋游戏实例
Jun 19 Javascript
详解基于vue-cli优化的webpack配置
Nov 06 Javascript
微信小程序利用swiper+css实现购物车商品删除功能
Mar 06 Javascript
js实现页面多个日期时间倒计时效果
Jun 20 Javascript
vue自定义右键菜单之全局实现
Apr 09 Vue.js
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
第十一节--重载
2006/11/16 PHP
Php Cookie的一个使用注意点
2008/11/08 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
浅谈PHP封装CURL
2019/03/06 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
javascript Keycode对照表
2009/10/24 Javascript
jquery 应用代码 方便的排序功能
2010/02/06 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
JavaScript设计模式之工厂方法模式介绍
2014/12/28 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
javascript去除空格方法小结
2015/05/21 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
使用post方法实现json往返传输数据的方法
2019/03/30 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
Python可变参数函数用法实例
2015/07/07 Python
Python Socket传输文件示例
2017/01/16 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
浅谈python的输入输出,注释,基本数据类型
2019/04/02 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
法雷奥SQA(electric)面试问题
2016/01/23 面试题
法学专业毕业生自荐信
2014/06/11 职场文书
送温暖献爱心活动总结
2014/07/08 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
南京市纪委监察局整改方案
2014/09/16 职场文书
2016年班主任新年寄语
2015/08/18 职场文书
干部作风纪律整顿心得体会
2016/01/23 职场文书
详解RedisTemplate下Redis分布式锁引发的系列问题
2021/04/27 Redis
Javascript的promise,async和await的区别详解
2022/03/24 Javascript