浅入浅出 react-router v4 实现嵌套路由

一、问题由来

  最近准备上手react,下载了一个react+antd做的后台管理demo玩耍了一下,发现使用的react-router v3,在v4已经发布这么久的前提下继续玩耍v3是如何也说不过去的,然后就顺带升级了一下,其中踩的一些坑总结一下给各位分享。

二、v3到v4主要有哪些变化?

  1.万物皆组件,所以v4只是一堆提供了导航功能的组件(还有若干对象和方法):  

     react-router  React Router 核心

     react-router-dom  web使用的版本(本文讨论和使用的对象)

     react-router-native  用于 React Native 的 React Router

     react-router-redux  React Router 和 Redux 的集成

     react-router-config  静态路由配置的小助手

  2.v3中的router被 BrowserRouter 和 HashRouter 取代,分别取代v4中的 history={browserHistory}  和 history={hashHistory} 代码如下:

  

 1 //v3写法
 2 import {Router, Route, hashHistory, IndexRedirect} from ‘react-router‘;
 3 <Router history={hashHistory}>
 4                 <Route ...>
 5 </Router>
 6
 7
 8 //v4写法
 9 import {BrowserRouter as Router, Route, Switch} from ‘react-router-dom‘;
10  <Router>
11          <Switch>
12                 <Route exact path=‘/‘ component={Login}/>
13                       <Route path=‘/app‘ component={Layout}/>
14                       <Route path=‘/login‘ component={Login}/>
15                   </Switch>
16           </Router>
17 <Router>

  3.v4 中已经没有 <IndexRoute> 了,但可以使用 <Route exact> 来达到同样的效果,新增的<Switch>标签,用于互斥路由;

   4.不再通过通过 <Route> 组件的嵌套来实现布局和页面嵌套,v3中将路由集中在一起处理,即使分离到若干文件中,本质也是一个配置文件;v4中路由规则位于布局和 UI 本身之间,因为route本身也是一个组件,所以我们玩耍的demo中的嵌套router需要重写了:

  

 1 //v3路由
 2         <Router history={hashHistory}>
 3                 <Route path={‘/‘} components={Page}>
 4                     <IndexRedirect to="/app/dashboard/index"/>
 5                     <Route path={‘app‘} component={App}>
 6                         ......
 7                     </Route>
 8                     <Route path={‘login‘} components={Login}/>
 9                     <Route path={‘404‘} component={NotFound}/>
10                 </Route>
11          </Router>
12
13 //v4中,我们需要实现嵌套路由本质是将路由以组件的形式分散到需要匹配的地方
14 export default class App extends Component {
15     render() {
16         return (
17             <div style={{height: ‘100%‘}}>
18                 <Router>
19                     <Switch>
20                         <Route exact path=‘/‘ component={Login}/>
21                         <Route path=‘/app‘ component={Layout}/>
22                         <Route path=‘/login‘ component={Login}/>
23                     </Switch>
24                 </Router>
25             </div>
26         )
27     }
28 }
29
30 class Layout extends React.Component {
31     render() {
32         return (
33             <Layout>
34                 <Sider>
35                     <Content style={{margin: ‘24px 16px‘, padding: 24, background: ‘#fff‘, minHeight: 280}}>
36                         <Switch>
37                             <Route path="/app/first" component={FirstPage}/>
38                             <Route path="/app/second" component={SecondPage}/>
39                         </Switch>
40                     </Content>
41                 </Sider>
42             </Layout>
43         );
44     }
45 }
46
47 class FirstPage extends React.Component {
48     render() {
49         return (
50             <div>这是第一个页面</div>
51         );
52     }
53 }
54
55
56 class SecondPage extends React.Component {
57     render() {
58         return (
59             <div>这是第一个页面</div>
60         );
61     }
62 }

  上面代码如果暂时看不懂没关系,我们一步一步拆解,首先App作为根组件初始化,这时候我们有三个路由"/","/app","/login",由于v4路由的包容性路由,凡是"/app/**"的路由将匹配到"/app",例如“/app/first”和“/app/second”都将匹配到“/app”,而exact的作用则是打破包容性路由规则,否则所有“/**”都将匹配到“/”,就没其他路由啥事儿了。

  Layout作为嵌套路由中处理不同布局的子路由,例如我们的demo中,作为管理系统,必然有 login, data-list,data-detail等不同布局的页面,而data-list和data-detail具有相同的左侧菜单栏和Header、Footer。Layout中引入公共的左侧菜单栏和Header、Footer,数据页面都匹配到这里。当然如果展示数据需要多种布局,完全可以Layout1,Layout2......

  我们的数据表有用户表,订单表,新闻表等等,FirstPage,SecondPage等就是这些具体业务数据的页面,“/app/first”或者“/app/first”的匹配路径:App->Layou->FirstPage,至此一个基本的嵌套路由就完成了,其他复杂路由可以同理扩展。

  点我下载嵌套路由demo

时间: 2024-08-04 22:36:00

浅入浅出 react-router v4 实现嵌套路由的相关文章

React Router 4.0 ---- 嵌套路由和动态路由

嵌套路由,从广义上来说,分为两种情况:一种是每个路由到的组件都有共有的内容,这时把共有的内容抽离成一个组件,变化的内容也是一个组件,两种组件组合嵌套,形成一个新的组件.另一种是子路由,路由到的组件内部还有路由. 对于共有的内容,典型的代表就是网页的侧边栏,假设侧边栏在左边,我们点击其中的按钮时,右侧的内容会变化,但不管右侧的内容怎么变化,左侧的侧边栏始终存在.这个侧边栏就是共有内容,如下图所示 这个共有内容要怎么处理? 首先想到的就是把这个功能提取出来,写成一个组件,然后再把这个组件依次应用到其

包学会之浅入浅出Vue.js:升学篇

上一篇<包学会之浅入浅出Vue.js:开学篇>中,我们初步了解单页面组件这个概念,现在通过一个项目,来进一步解析组件的应用吧,Go~ 需求背景 组件库是做UI和前端日常需求中经常用到的,把一个按钮,导航,列表之类的元素封装起来,方便日常使用,调用方法只需直接写上<qui-button></qui-button>或者<qui-nav></qui-nav>这样的代码就可以,是不是很方便呢,接下来我们将要完成以下页面: 这是我们组件库的首页,包含三个子

浅入浅出数据结构(25)——最小生成树问题

上一篇博文我们提到了图的最短路径问题:http://www.cnblogs.com/mm93/p/8434056.html.而最短路径问题可以说是这样的一个问题:路已经修好了,该怎么从这儿走到那儿?但是在和图有关的问题中,还有另一种有趣的问题:修路的成本已经知道了,该怎么修路才能尽可能节约成本,同时将这些地方都连起来? 比如我们知道有这么几个城市,它们互相之间还没有路: 经过实地考察后,发现可以修的路以及各条路的修路成本如下: 但是我们的预算有限,需要在修路时尽可能的省钱(也就是尽量减小所有边的

浅入深出Vue:第一个页面

今天正式开始入门篇,也就是实战了~ 首先我们是要做一个博客网站,UI 框架采用江湖传闻中的 ElementUI,今天我们就来利用它确定我们博客网站的基本布局吧. 准备工作 新建一个vue项目(可以参考基础篇里的搭建方法,也可以参考官网现在最近的 Vue CLI 3.x进行可视化创建和管理 安装 vue-router 安装 elementui 以上的操作都可以在之前的博文中(基础篇)找到完整步骤,这里就不重复了. 我们做完准备工作之后,目录结构如下: 我们来看看这个目录: |--public 公共

浅入浅出SQL注入

已经开始了学习牛腩新闻发布系统,在讲后台代码的时候讲了一些重构SQLHelper的知识,存储过程和触发器等,这些以前都是接触过的.而SQL注入是以前没有注意过的,所以停下来总结学习一下SQL注入. 首先什么是SQL注入呢? 实战篇~~~~~~~~~~ SQL注入概念 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到

浅入深出ElasticSearch构建高性能搜索架构

浅入深出ElasticSearch构建高性能搜索架构  课程学习地址:http://www.xuetuwuyou.com/course/161 课程出自学途无忧网:http://www.xuetuwuyou.com 一.课程用到的软件 ElasticSearch5.0.0 Spring Tool Suite 3.8.2.RELEASE Maven3.0.5 Spring4 Netty4 Hadoop2.7.1 Kibana5.0 JDK1.8.0_111 二.课程目标 1.快速学习Elastic

包学会之浅入浅出Vue.js:结业篇

在第一篇<包学会之浅入浅出Vue.js:开学篇>和上一篇<包学会之浅入浅出Vue.js:升学篇>的学习中,我们首先了解了Vue环境的搭建以及两个重要思想--路由和组件的学习,通过组件库中的按钮组件和导航组件,相信大家也开始了解相应的知识点,接下来我们会详细分析下如何完成由多个组件组成一个复用组件的开发流程. 下面先看看我们的需求 列表组件quiList.vue 本节我们主要要完成这样一个列表功能,每一行的列表是一个组件,列表内可能出现按钮组件或者箭头组件,点击按钮组件可以自定义事件

浅入浅出---JQuery到底是什么?

学习完了JQuery之后,我便感觉云里雾里的,JQuery到底是什么,朦朦胧胧感觉到JQuery应该是javascript函数的封装,就应该像WinForm窗体应用程序中可以调用的系统函数,据之前所学的javascript,知道JavaScript是一种镶嵌在HTML文档中的一种脚本语言, <body> <formid="form1" name="form1" method="post" > <label for=&

浅入浅出EmguCv(一)OpenCv与EmguCv

最近接触计算机视觉方面的东西,于是准备下手学习opencv,从官网下载windows的安装版,配置环境,一系列步骤走完后,准备按照惯例弄个HelloWord.也就是按照网上的教程,打开了那个图像处理领域非常有名的lena图片(据说是个裸女\(^o^)/~). 正当我摩拳擦掌准备开始opencv学习之旅的时候,习惯了GUI的我突然觉得用C++做开发弄界面很麻烦,不如用C#来的方便,于是又发现了一个封装了opencv的.net库,可以被VC++,VC#,VB.net调用,即EmguCV.网上对于Em

浅入浅出EmguCv(三)EmguCv打开指定视频

打开视频的思路跟打开图片的思路是一样的,只不过视频是由一帧帧图片组成,因此,打开视频的处理程序有一个连续的获取图片并逐帧显示的处理过程.GUI同<浅入浅出EmguCv(二)EmguCv打开指定图片>一样,只不过处理程序编程如下所示: 1 /// <summary> 2 /// 点击按钮打开指定图片 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <pa