详解升级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中for..in循环陷阱介绍
Nov 12 Javascript
append和appendTo的区别以及appendChild用法
Dec 24 Javascript
JavaScript 学习笔记之变量及其作用域
Jan 14 Javascript
javascript实现动态加载CSS
Jan 26 Javascript
javascript异步处理工作机制详解
Apr 13 Javascript
JS实现的最简Table选项卡效果
Oct 14 Javascript
微信小程序 Flex布局详解
Oct 09 Javascript
基于jQuery制作小图标上下滑动特效
Jan 18 Javascript
JS字典Dictionary类定义与用法示例
Feb 01 Javascript
js继承的这6种方式!(上)
Apr 23 Javascript
微信小程序云开发实现云数据库读写权限
May 17 Javascript
Vue export import 导入导出的多种方式与区别介绍
Feb 12 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中的foreach问题
2013/06/30 PHP
谈谈从phpinfo中能获取哪些值得注意的信息
2017/03/28 PHP
学习ExtJS table布局
2009/10/08 Javascript
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
vuejs绑定class和style样式
2017/04/11 Javascript
js实现随机点名小功能
2017/08/17 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
微信小程序自定义波浪组件使用方法详解
2019/09/21 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
对python 操作solr索引数据的实例详解
2018/12/07 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
浅谈python 类方法/静态方法
2020/09/18 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
css 如何让背景图片拉伸填充避免重复显示
2013/07/11 HTML / CSS
出国留学经济担保书
2014/04/01 职场文书
技术经济专业求职信
2014/09/03 职场文书
教学质量月活动总结
2015/05/11 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
信仰观后感
2015/06/03 职场文书
国情备忘录观后感
2015/06/04 职场文书
十七岁的单车观后感
2015/06/12 职场文书
win10下go mod配置方式
2021/04/25 Golang