React 实践记录 03 React router
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的更多相关文章
- React 实践记录 01 组件开发入门
Introduction 本文组成: Ryan Clark文章Getting started with React的翻译. 博主的实践心得. React由Facebook的程序员创建,是一个非常强大的 ...
- React 实践记录 02 Flux introduction
Introduction 本文组成: React 官方文档翻译 相关实践心得. 内容上是Flux的介绍,例子将会在以后写出. 一旦稍微多了解一点React,很难避免听到Flux这个名词. Flux是一 ...
- React 实践记录 04 Flux demo
Introduction flux应用架构如下图所示,本文并不是讲述怎么立即做一个酷炫的应用,而是讲述如何依照这种框架,来进行代码的组织. 我们先把这个流程转述为文字:抛开与webAPI的交互不谈,以 ...
- React学习(3)——Router路由的使用和页面跳转
React-Router的中文文档可以参照如下链接: http://react-guide.github.io/react-router-cn/docs/Introduction.html 文档中介绍 ...
- React实践
React实践(一) 该实践取自官方教程:https://github.com/reactjs/react-tutorial 主要是自实现的过程以及一些心得体会 该实践是实现一个评论框. 一个展示 ...
- React 实践项目 (二)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...
- React 实践项目 (三)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行 ...
- React 实践项目 (五)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...
- [03] react 测试
测试是开发周期中的一个重要组成部分.没有测试的代码被称为:遗留代码.对于我而言,第一次学习 React 和 JavaScript 的时候,感到很有压力.如果你也是刚开始学习 JS/React,并加入他 ...
随机推荐
- OC-内存管理的所有权链问题
背景: 最近维护之前的项目,没有注意具体的对象之间的关系,导致了一个bug. 让我了解到对象的所有权链问题. 需要内存管理的知识: 众所周知,oc是使用引用计数来管理内存的(当一个对象被持有,他的re ...
- python 基础之第五天
###########window路径写法########## In [1]: winpath = 'C:\tmp' In [2]: print winpath C: mp In [3]: winpa ...
- 「LuoguP1402」 酒店之王(最大流
题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...
- Watir 简化日常工作实例
公司的官方主页要优化搜索任务,一共有110个独立页面,开发工程师做了以下工作:1. 为所有这些页面的每个图片添加了alt:2. 为页面上的每个标题添加了面包屑:3. 为网站最重要的标题设置H1标签,而 ...
- js格式
/** * Created by admin on 2017/9/22. */ // 分号后不要再有多余的空格 var name = "North"; var name = &qu ...
- Rikka with Sequence
题意: 给一长度为n的序列,维护三个操作:区间开根,区间加,区间求和. 解法: 注意到本题关键在于区间开根: 对于一个数字,只要进行$O(loglogT)$次开根即会变为1. 考虑线段树,对于线段数上 ...
- 1.1- 1.2 hive入门
一.hive是什么 由Facebook开源用于解决海量结构化日志的数据统计: Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张表, 并提供类SQL查询功能: 构建在Had ...
- 微信小程序开发之页面跳转并携带参数
接口: wx.navigateTo({url:......}) 保留当前页面,跳转到应用内指定URL页面,导航栏左上角有返回按钮 wx.redirecTo({url:.....}) 关 ...
- 20个Flutter实例视频教程-第03节: 不规则底部工具栏制作-1
第03节: 不规则底部工具栏制作-1 博客地址: https://jspang.com/post/flutterDemo.html#toc-973 视频地址: https://www.bilibili ...
- MyEclipse控制台console自动跳动的解决方案
有时候Eclipse启动,控制台console不会自动跳出来,需要手工点击该选项卡才行 按下面的设置,可以让它自动跳出来(或不跳出来): windows -> preferences ...