Introduction

本文主要参考了react router 的官方文档。

React Router是一套完整的配合React的路由解决方案,可能你已经知道前端路由,或者知道后端有路由的概念,如下图:



React Router可以帮助我们将URL与组件状态同步,实现路由。

Router Overview

我们先来看看,不使用React Router的话,动态图中的功能要如何实现:

var React = require('react');

var About = React.createClass({
render: function () {
return(
<div>
<h2>About</h2>
<p>这里将会出现N多介绍文字balabala</p>
</div>
);}
}); var blogs = React.createClass({
render: function () {
return(
<div>
<h2>blogs</h2>
<a href="#">文章A</a>
<br />
<a href="#">文章B</a>
<br />
<a href="#">文章C</a>
<br />
<a href="#">文章D</a>
</div>
);}
}); var Home = React.createClass({
render: function () {
return(
<div>
<h2>Home</h2>
<p>这里是首页</p>
</div>
);}
}); var App = React.createClass({
render () {
var Child;
switch (this.props.route) {
case 'about': Child = About; break;
case 'blogs': Child = blogs; break;
default: Child = Home;
} return (
<div>
<h1>App</h1>
<Child/>
</div>
)
}
}); function render () {
var route = window.location.hash.substr(1);
React.render(<App route={route} />, document.body);
}
window.addEventListener('hashchange', render);
render();

关于react语法细节,请参考博主之前关于react的文章。

每当URL中hash部分改变时,APP组件会渲染一个不同的Child组件。非常简单明了。

但是,一旦我们需要再嵌套一些路由,比如 blogs/react,about/communicate,那么 window.location.hash.substr(1); 这样的逻辑就会变的更为复杂,如果再多嵌套一点呢?

With React Router

多层嵌套的URL以及多层嵌套的组件结构之间的映射是React router的核心,React Router在路由上使用JSX来声明式编程。

var Router = require('react-router');
var Route = Router.Route; // declare our routes and their hierarchy
var routes = (
<Route handler={App}>
<Route path="about" handler={About}/>
<Route path="blogs" handler={blogs}/>
</Route>
);

我们现在可以去掉之前switch部分的代码,替换成RouteHandler

var RouteHandler = Router.RouteHandler;

var App = React.createClass({
render () {
return (
<div>
<h1>App</h1>
<RouteHandler/>
</div>
)
}
});

最后,我们侦听url的变化,并渲染组件。以下代码将routes渲染到RouteHandler。

Router.run(routes, Router.HashLocation, (Root) => {
React.render(<Root/>, document.body);
});

这里写 => 这种ES6会不会引起兼容性问题?大可放心,webpack会帮忙生成浏览器兼容的代码。

所有的Route组件本身都是不会渲染的,它们只是用于配置。

引入嵌套

我们来看看如何解决之前说的嵌套问题。

再创建一个组件:

var ReactContent = React.createClass({
render: function () {
return(
<div>
<p>这是一篇React 博文</p>
</div>
);}
});

我们可以这样写嵌套路由:

var routes = (
<Route path="/" handler={App}>
<DefaultRoute handler={Home}/> <Route path="about" handler={About}/>
<Route path="blogs" handler={Blogs}>
<Route path="react" handler={ReactContent}/>
</Route>
</Route>
);

也可以这样写:

var routes = (
<Route path="/" handler={App}>
<DefaultRoute handler={Home}/> <Route path="about" handler={About}/>
<Route path="blogs" handler={Blogs}/>
<Route path="blogs/react" handler={ReactContent}/>
</Route>
);



这样当然也是可以的

<Route path="blogs/:id" handler={ReactContent}/>

Getting the url parameters

刚才提到了:id,如果我们想获得它,怎么做呢?

//没错,直接可以从handler组件的props中拿到。
var id = this.props.params.id;

DefaultRoute

我们可以给路由提供默认渲染,比如给跟路由加一个,由它完成用户访问index.html(或者你的主页是其它什么。。。)时的渲染任务。

<Route path="/" handler={App}>
<DefaultRoute handler={Home}/>
</Route>

NotFoundRoute

URL:xxx#a/b。 假设,a是有路由的,若a/b没有,那么,我们称之为无法找到路由。请注意区分无法找到路由何无法找到资源的区别。

var NotFound = React.createClass({
render: function () {
return(
<h1>对不起,我们找不到路由哦</h1>
);}
}); <Route path="/" handler={App}>
<DefaultRoute handler={Home}/> <Route path="about" handler={About}/>
<Route path="blogs" handler={Blogs}/>
<Route path="blogs/react" handler={ReactContent}/>
<NotFoundRoute handler={NotFound} />
</Route>

本文完。

React 实践记录 03 React router的更多相关文章

  1. React 实践记录 01 组件开发入门

    Introduction 本文组成: Ryan Clark文章Getting started with React的翻译. 博主的实践心得. React由Facebook的程序员创建,是一个非常强大的 ...

  2. React 实践记录 02 Flux introduction

    Introduction 本文组成: React 官方文档翻译 相关实践心得. 内容上是Flux的介绍,例子将会在以后写出. 一旦稍微多了解一点React,很难避免听到Flux这个名词. Flux是一 ...

  3. React 实践记录 04 Flux demo

    Introduction flux应用架构如下图所示,本文并不是讲述怎么立即做一个酷炫的应用,而是讲述如何依照这种框架,来进行代码的组织. 我们先把这个流程转述为文字:抛开与webAPI的交互不谈,以 ...

  4. React学习(3)——Router路由的使用和页面跳转

    React-Router的中文文档可以参照如下链接: http://react-guide.github.io/react-router-cn/docs/Introduction.html 文档中介绍 ...

  5. React实践

    React实践(一)   该实践取自官方教程:https://github.com/reactjs/react-tutorial 主要是自实现的过程以及一些心得体会 该实践是实现一个评论框. 一个展示 ...

  6. React 实践项目 (二)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

  7. React 实践项目 (三)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行 ...

  8. React 实践项目 (五)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

  9. [03] react 测试

    测试是开发周期中的一个重要组成部分.没有测试的代码被称为:遗留代码.对于我而言,第一次学习 React 和 JavaScript 的时候,感到很有压力.如果你也是刚开始学习 JS/React,并加入他 ...

随机推荐

  1. tty初探 — uart驱动框架分析

    写在前面: 我们没有讲UART驱动,不过我们认为,只要系统学习了第2期,应该具备分析UART驱动的能力,小编做答疑几年以来,陆陆续续有不少人问到UART驱动怎么写,所以今天就分享一篇深度长文(1700 ...

  2. 洛谷 - UVA11424 - GCD - Extreme (I) - 莫比乌斯反演 - 整除分块

    https://www.luogu.org/problemnew/show/UVA11424 原本以为是一道四倍经验题来的. 因为输入的n很多导致像之前那样 \(O(n)\) 计算变得非常荒谬. 那么 ...

  3. 使用WebStorm/IDEA上传本地项目到GitHub

    在使用 WebStorm/IDEA 上传本地项目到 GitHub 之前,先要做一些相关配置. 以 WebStorm 为例,IDEA 同. 首先打开 WebStorm ,依次点击File -> S ...

  4. JAG Practice Contest for ACM-ICPC Asia Regional 2016 C题【贪心】

    camp给出的题解: 题解:贪心,先算出最小需要的长度.然后从左到右依次确定每一位.复杂度O(n)O(n) 长度为 2n2n 的串可以构造出需要 [0,1+3+...+2n-1][0,1+3+...+ ...

  5. andriod ndk配置

    r7及以后版本不需要再配置cywin ,留影 先在path中配置ndk的环境变量,位置为ndk的根目录,也可在图5中的位置配置环境变量

  6. uoj#273. 【清华集训2016】你的生命已如风中残烛(组合数学)

    传送门 一道打表题 我们把那些普通牌的位置看成\(-1\),那么就是要求有多少个排列满足前缀和大于等于\(1\) 考虑在最后放一个\(-1\),那么就是除了\(m+1\)的位置前缀和都要大于等于\(1 ...

  7. 第十九篇 .NET高级技术之C#中的线程(一)

    原文://http://www.cnblogs.com/miniwiki/archive/2010/06/18/1760540.html 文章系参考转载,英文原文网址请参考:http://www.al ...

  8. bzoj1660:[Usaco2006 Nov]badhair乱头发节

    Description 农民John的某 N 头奶牛 (1 <= N <= 80,000) 正在过乱头发节!由于每头牛都 意识到自己凌乱不堪的发型, FJ 希望统计出能够看到其他牛的头发的 ...

  9. IP服务-2-RARP和BOOTP

    ARP和代理ARP进程都是在一台主机知道了自己的IP地址和子网掩码后发生的.RARP.BOOTP和DHCP则代表了一类协议的发展,这类协议用来帮助主机动态地学习自己的IP地址.

  10. django (一) 环境的配置及Django文件简介

    1, 创建虚拟环境(virtualenv 和virtualenvwrapper) 1.1, virtualenv的概述 virtualenv是用来创建Python的虚拟环境的库,虚拟环境能够独立于真实 ...