详解升级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中setInterval的用法总结
Nov 20 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
Dec 02 Javascript
Javascript获取统一管理的提示语(message)
Feb 03 Javascript
JavaScript Array对象详解
Mar 01 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
Jun 15 Javascript
JS实现的几个常用算法
Nov 12 Javascript
详解js界面跳转与值传递
Nov 22 Javascript
2种在vue项目中使用百度地图的简单方法
Sep 28 Javascript
vue+express+jwt持久化登录的方法
Jun 14 Javascript
谈谈IntersectionObserver懒加载的具体使用
Oct 15 Javascript
js实现简单掷骰子效果
Oct 24 Javascript
js实现随机点名程序
Sep 17 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
资料注册后发信小技巧
2006/10/09 PHP
php中设置index.php文件为只读的方法
2013/02/06 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
2019/04/10 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
基于jquery的跟随屏幕滚动代码
2012/07/24 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
2018/08/13 jQuery
Vue2.0生命周期的理解
2018/08/20 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
python实现在控制台输入密码不显示的方法
2015/07/02 Python
Python中的集合类型知识讲解
2015/08/19 Python
python 生成器协程运算实例
2017/09/04 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python实现京东秒杀功能
2018/07/30 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
python hash每次调用结果不同的原因
2019/11/21 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
JAVA软件工程师测试题
2014/07/25 面试题
美德少年事迹材料
2014/01/23 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
2015年语文教学工作总结
2015/05/25 职场文书
个人催款函范文
2015/06/24 职场文书