详解升级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实现单行文字间歇向上滚动源代码
Jun 02 Javascript
JavaScript var声明变量背后的原理示例解析
Oct 12 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
Dec 27 Javascript
用jquery写的菜单从左往右滑动出现
Apr 11 Javascript
浅析javascript中function 的 length 属性
May 27 Javascript
使用GruntJS构建Web程序之安装篇
Jun 04 Javascript
js判断一个字符串是以某个字符串开头的简单实例
Dec 27 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
node.js中http模块和url模块的简单介绍
Oct 06 Javascript
node.js实现微信开发之获取用户授权
Mar 18 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
Nov 09 Javascript
解决vue scoped scss 无效的问题
Sep 04 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在特殊字符前加斜杠的实现代码
2011/07/17 PHP
php 调试利器debug_print_backtrace()
2012/07/23 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
Vue-CLI3.x 设置反向代理的方法
2018/12/06 Javascript
jQuery访问json文件中数据的方法示例
2019/01/28 jQuery
JavaScript碎片—函数闭包(模拟面向对象)
2019/03/13 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
基于Element的组件改造的树形选择器(树形下拉框)
2020/02/27 Javascript
详解Vue中的MVVM原理和实现方法
2020/07/15 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
python的id()函数解密过程
2012/12/25 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
2019/01/30 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
python super()函数的基本使用
2020/09/10 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
HTML5 Canvas的性能提高技巧经验分享
2013/07/02 HTML / CSS
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
美国领先的个性化礼品商城:Personalization Mall
2019/07/27 全球购物
Yankee Candle官网:美国最畅销蜡烛品牌之一
2020/01/05 全球购物
英文留学推荐信范文
2014/01/25 职场文书
献爱心捐款倡议书
2014/05/14 职场文书
投标授权委托书范文
2014/08/02 职场文书
文秘班元旦晚会活动策划方案
2014/08/28 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
民间个人借款协议书
2014/09/30 职场文书
师范生免费教育协议书范本
2014/10/09 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
用JS创建一个录屏功能
2021/11/11 Javascript