React-router v4 路由配置方法小结


Posted in Javascript onAugust 08, 2017

本文主要介绍了React-router v4 路由配置方法小结,分享给大家,也给自己留个笔记

一. Switch 、Router 、Route三者的区别

1、Route

Route 是建立location 和 ui的最直接联系

2、Router

react-router v4 中,Router被拆分成了StaticRouter、MemoryRouter、BrowserRouter、HashRouter、NativeRouter。

MemoryRouter、BrowserRouter、HashRouter 等于

import { Router } from 'react-router'
<!--这里可以有三种-->
<!--history 部分源码
exports.createBrowserHistory = _createBrowserHistory3.default;
exports.createHashHistory = _createHashHistory3.default;
exports.createMemoryHistory = _createMemoryHistory3.default;
-->
import createBrowserHistory from 'history/createBrowserHistory'
//
const history = createBrowserHistory()

<Router history={history}>
 <App/>
</Router>

NativeRouter(给rn使用的)

A <Router> for iOS and Android apps built using React Native.

这里新增strict 和 exact

使用了strict location 大于等于path才能匹配,eq path='/one' location='/one/a'能匹配。

使用了exact location 约等于 path 才能匹配,eq path='/one' location='/one'或者 '/one/'能匹配,所以说是约等于。

使用了exact 和 strict location = path才能匹配

StaticRouter(后续补充)

3、Switch

这是v4版本中新添加,主要用来做唯一匹配的功能。就是想要在众多路由中只匹配其中一个路由。

二、v4 版本中路由应该如何配置呢?

1.基本配置(这个和v3中基本一致,效果也基本一样)

匹配 <= location eq.( /b => / + /b ) ( / => / )

<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
   <div>
     <Route path="/" component={aContainer} />
     <Route path="/b" component={bContainer} />
   </div>
  </BrowserRouter>

2.含Switch 配置

匹配 <= location eq.( /b => /b ) ( / => / ) 唯一匹配

<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
   <Switch>
       //这里用exact,仅仅是担心location被 path='/'截胡了。
     <Route exact path="/" component={aContainer} />
     <Route path="/b" component={bContainer} />
   </Switch>
  </BrowserRouter>

问题(三个问题)

1.如何设置公共的Component

第一种方式

<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
   <div>
     <Route path="/" component={aContainer} />
     <Route path="/b" component={bContainer} />
   </div>
  </BrowserRouter>

第二种方式(父子嵌套)

<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
   <div >
    <Route path="/" component={aContainer} />
    <Route path="/b" component={Parent} />
    {/* {app()} */}
   </div>
  </BrowserRouter>
const Parent = ({ match }) => (
 <div>
  <Route path={`${match.url}/`} component={bContainer} />
  <Route path={`${match.url}/c`} component={cContainer} />
  <Route path={`${match.url}/d`} component={dContainer} />
 </div>
);

这种情况 bContainer就是是公用的Component

2.如何设置getComponent,按需加载

3.是否有简化写法

npm install --save react-router-config

第一步 配置路由

const routes = [
 { component: bContainer,
  routes: [
   { path: '/',
    exact: true,
    component: bContainer
   },
   { path: '/b/b',
    component: bContainer,
    routes: [
     { path: '/b/b/b',
      component: bContainer
     }
    ]
   }
  ]
 }
]

第二步 设置路由

<BrowserRouter forceRefresh={!supportsHistory} keyLength={12}>
   <div >
     {renderRoutes(routes)}
   </div>
 </BrowserRouter>

第三步 需要在container的render中去调用方法

<div>
 1111
 {renderRoutes(this.props.route.routes)}
</div>

这个优势是可以统一配置,劣势是需要在container中统一调用,但是这个抽出来统一实现,问题也不大,并且还可以解决 问题一。

这个renderRoutes实际是就是用一层Switch和多个Route来包了一层。

React-router v4 路由配置方法小结

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中的私有成员
Sep 18 Javascript
学习YUI.Ext 第二天
Mar 10 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
Apr 26 Javascript
JavaScript定时器详解及实例
Aug 01 Javascript
js实现右下角提示框的方法
Feb 03 Javascript
使用JavaScript开发IE浏览器本地插件实例
Feb 18 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
Aug 05 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
Aug 24 Javascript
JavaScript弹出对话框的三种方式
Mar 23 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
May 14 Javascript
微信小程序实现蓝牙打印
Sep 23 Javascript
解决vue自定义指令导致的内存泄漏问题
Aug 04 Javascript
用Vue.extend构建消息提示组件的方法实例
Aug 08 #Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 #Javascript
VUE实现表单元素双向绑定(总结)
Aug 08 #Javascript
ES6模块化的import和export用法方法总结
Aug 08 #Javascript
Vue项目中quill-editor带样式编辑器的使用方法
Aug 08 #Javascript
webpack 2.x配置reactjs基本开发环境详解
Aug 08 #Javascript
vue-quill-editor实现图片上传功能
Aug 08 #Javascript
You might like
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
async和DOM Script文件加载比较
2014/07/20 PHP
php的XML文件解释类应用实例
2014/09/22 PHP
php 在线导入mysql大数据程序
2015/06/11 PHP
Yii遍历行下每列数据的方法
2016/10/17 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
不错的一个日期输入 动态
2006/11/06 Javascript
JS 控制CSS样式表
2009/08/20 Javascript
javascript常用函数归纳整理
2014/10/31 Javascript
JS实现点击按钮后框架内载入不同网页的方法
2015/05/05 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
Angular5.1新功能分享
2017/12/21 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
用Python的Django框架来制作一个RSS阅读器
2015/07/22 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
Python configparser模块配置文件过程解析
2020/03/03 Python
python 调用Google翻译接口的方法
2020/12/09 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
文秘专业大学生求职信
2013/11/10 职场文书
中国在我心中演讲稿
2014/09/13 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python
使用CSS实现音波加载效果
2023/05/07 HTML / CSS