详解升级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之旅 对象的原型链之由来
Aug 25 Javascript
img onload事件绑定各浏览器均可执行
Dec 19 Javascript
基于jquery实现的文字淡入淡出效果
Nov 14 Javascript
javascript 小数取整简单实现方式
May 30 Javascript
JQuery设置时间段下拉选择实例
Dec 30 Javascript
jQuery入门之层次选择器实例简析
Dec 11 Javascript
批量下载对路网图片并生成html的实现方法
Jun 07 Javascript
jQuery的deferred对象使用详解
Sep 25 Javascript
js实现楼层导航功能
Feb 23 Javascript
关于TypeScript中import JSON的正确姿势详解
Jul 25 Javascript
原生js实现简单的模态框示例
Sep 08 Javascript
vue如何安装使用Quill富文本编辑器
Sep 21 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定时任务延缓执行的实现
2014/10/08 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
通过JS 获取Mouse Position(鼠标坐标)的代码
2009/09/21 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
JS解析XML实例分析
2015/01/30 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
jQuery+html5实现div弹出层并遮罩背景
2015/04/15 Javascript
深入php面向对象、模式与实践
2016/02/16 Javascript
基于JS实现的随机数字抽签实例
2016/12/08 Javascript
在vue中获取dom元素内容的方法
2017/07/10 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
python调用cmd命令行制作刷博器
2014/01/13 Python
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
keras中的History对象用法
2020/06/19 Python
Python自动登录QQ的实现示例
2020/08/28 Python
Python爬取微信小程序通用方法代码实例详解
2020/09/29 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
HTML5之消息通知的使用(Web Notification)
2018/10/30 HTML / CSS
教师应聘个人求职信
2013/12/10 职场文书
自荐书模板
2013/12/15 职场文书
历史系自荐信范文
2013/12/24 职场文书
知识竞赛主持词
2014/03/26 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
离婚答辩状怎么写
2015/05/22 职场文书
离婚纠纷代理词
2015/05/23 职场文书
培训感想范文
2015/08/07 职场文书
远程教育培训心得体会
2016/01/09 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS