详解升级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基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
Aug 05 Javascript
js身份证验证超强脚本
Oct 26 Javascript
js输出列表实现代码
Sep 12 Javascript
jQuery实现下拉框左右选择的简单实例
Feb 22 Javascript
原生Javascript封装的一个AJAX函数分享
Oct 11 Javascript
JS控制表单提交的方法
Jul 09 Javascript
jQuery中事件与动画的总结分享
May 24 Javascript
微信小程序 自己制作小组件实例详解
Dec 22 Javascript
Angular 封装并发布组件的方法示例
Apr 19 Javascript
vue router 配置路由的方法
Jul 26 Javascript
angular 实时监听input框value值的变化触发函数方法
Aug 31 Javascript
ionic3双击返回退出应用的方法
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
PHP 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
二招解决php乱码问题
2012/03/25 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
Bootstrap每天必学之响应式导航、轮播图
2016/04/25 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
原生js实现获取form表单数据代码实例
2019/03/27 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python如何将图片转换为字符图片
2020/08/19 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
HTML的form表单和django的form表单
2019/07/25 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
python开发前景如何
2020/06/11 Python
python爬虫请求头设置代码
2020/07/28 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
pycharm 代码自动补全的实现方法(图文)
2020/09/18 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
纯CSS实现菜单、导航栏的3D翻转动画效果
2014/04/23 HTML / CSS
HTML5资源预加载(Link prefetch)详细介绍(给你的网页加速)
2014/05/07 HTML / CSS
HTML5中外部浏览器唤起微信分享
2020/01/02 HTML / CSS
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
大学毕业生文采飞扬的自我鉴定
2013/12/03 职场文书
优秀毕业生求职信范文
2014/01/02 职场文书
服务承诺口号
2014/05/22 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
六年级作文之预言作文
2019/10/25 职场文书
CocosCreator入门教程之网络通信
2021/04/16 Javascript