详解升级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 面向对象之命名空间
May 04 Javascript
JS判断是否长按某一键的方法
Mar 02 Javascript
jQuery模仿单选按钮选中效果
Jun 24 Javascript
AngularJs bootstrap详解及示例代码
Sep 01 Javascript
Es6 写的文件import 起来解决方案详解
Dec 13 Javascript
fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法
Mar 24 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
Nov 24 Javascript
angular json对象push到数组中的方法
Feb 27 Javascript
微信小程序自定义多选事件的实现代码
May 17 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
Sep 13 Javascript
vue+php实现的微博留言功能示例
Mar 16 Javascript
深入解读VUE中的异步渲染的实现
Jun 19 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
一些花式咖啡的配方
2021/03/03 冲泡冲煮
用PHP和ACCESS写聊天室(三)
2006/10/09 PHP
一个PHP的远程图片抓取函数分享
2013/09/25 PHP
输入值/表单提交参数过滤有效防止sql注入的方法
2013/12/25 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
Python回文字符串及回文数字判定功能示例
2018/03/20 Python
对django xadmin自定义菜单的实例详解
2019/01/03 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
深入学习python多线程与GIL
2019/08/26 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
Python新手学习标准库模块命名
2020/05/29 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
Python如何将装饰器定义为类
2020/07/30 Python
详解anaconda安装步骤
2020/11/23 Python
Python如何telnet到网络设备
2021/02/18 Python
python中Pexpect的工作流程实例讲解
2021/03/02 Python
Parts Express:音频、视频和扬声器的第一来源
2017/04/25 全球购物
农业大学毕业生的个人自我评价
2013/10/11 职场文书
学生党员思想汇报范文
2014/01/09 职场文书
公司年底活动方案
2014/08/17 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
Python 文本滚动播放器的实现代码
2021/04/25 Python
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python
MSSQL基本语法操作
2022/04/11 SQL Server