【10】react 之 react-router
1.1. 路由
路由:URL与处理器的映射。
浏览器当前的 URL 发生变化时,路由系统会做出一些响应,用来保证用户界面与 URL 的同步。
1.2. Router安装
npm i react-router -save
1.3. Router使用
路由器Router就是React的一个组件,所以使用方式跟React组件使用方式一样。
import {Router ,Route,hashHistory} from 'react-router';
ReactDOM.render(<Router/>,document.getElementById('app'));
Router组件本身只是一个容器,真正的东西(路由)要通过Route组件定义。
import React from 'react';
import ReactDOM from 'react-dom';
import {Router,Route,hashHistory} from 'react-router';
import Home from './components/home';
import About from './components/about'; ReactDOM.render(
<Router history={hashHistory}>
<Route path='/about' component={About}/>
</Router>,
document.getElementById('app')
);
Router: 路由器对象
history=hashHistoryRouter路由采用hash方式监听地址栏变化,并将URL解析(#后面的内容)为位置对象,路由器可以使用该位置对象(#后面的内容)来匹配路由并呈现正确的组件集。
http://localhost:8000/#/home <Route path='/home' component={Home} />
http://localhost:8000/#/about <Route path='/about' component={About} />
Route :路由对象
path :路径
component 显示的组件
1.4. Router嵌套
一个应用由多个组件构成,复杂的应用中,可能存在嵌套的问题。嵌套路由非常简单,你只需要做两件事情:
1、Route中配置嵌套的Route;
render((
<Router history={ hashHistory }>
<Route path="/" component={ App }>
<Route path="select" component={ Select }></Route>
<Route path="found" component={ Found }></Route>
<Route path="follow" component={ Follow }></Route>
<Route path="my" component={ My }>
<Route path=":myname" component={ MyName }></Route>
<Route path="mysex" component={ MySex }></Route>
</Route>
</Route>
</Router>
), document.getElementById('root'));
2、嵌套Route的父组件中使用{this.props.children}渲染子Route的组件即可;
import React from 'react';
import ReactDOM from 'react-dom';
import {Router,Route,hashHistory} from 'react-router';
import App from './components/App'
import Home from './components/home';
import About from './components/about'; ReactDOM.render(
<Router history={hashHistory}>
<Route path='/' component={App} >
<Route path='home' component={Home}/>
<Route path='about' component={About}/>
</Route>
</Router>,
document.getElementById('app')
);
Route / 中嵌套了”/home”和”/about”两个路由。
App.js
import React,{Component} from 'react';
class App extends Component{
render(){
return (<div>
<nav>
<ul>
<li><a href='#/home'>首页</a></li>
<li><a href='#/about'>关于我们</a></li></ul>
</nav>
<main>{this.props.children} //显示嵌套路由的组件</main>
</div> );
}
} export default App;
App组件的this.props.children属性就是子组件。
1.4.1. 补充
子路由也可以不写在Router组件里面,单独传入Router组件的routes属性。
var routes = <Route path="/" component={App}> <Route path="home" component={Home}/> <Route path="about" component={About}/> </Route>; <Router routes={routes} history={hashHistory}/>
Route可以无限级的嵌套,只需要遵循响应结构即可,另外不要忘记在嵌套Route的父组件中使用{this.props.children}显示子路由组件。
1.5. path 属性
Route组件的path属性指定路由的匹配规则。如果未提供,路由器将尝试匹配子路由。
注意点:它将与父路由的路径相连,除非它以/开头,使其成为绝对路径。
<Route path='/' component={App} > <Route path='home' component={Home}/> <Route path='about' component={About}/> </Route>
1.5.1. 路径参数
URL参数:地址中可以传入参数,采用:paramName
<Route path='users/:userId' component={User}/>
路径中参数都会传入到组件,可以通过this.props.routeParams获取,比如获取userId,this.props.routeParams.userId。
1.6. IndexRoute组件
<Router history={hashHistory}>
<Route path='/' component={App} >
<Route path='home' component={Home}/>
<Route path='about' component={About}/>
</Route>
</Router>
配置了一个嵌套路径,但是访问“/”的时候,你会发现只有App组件本身的内容,只有一个导航菜单,可能我们想默认进入首页的时候就显示Home子组件,那么我们就需要IndexRoute。
IndexRoute:设置默认显示的子组件。
import {IndexRoute} from 'react-router'; <Router history={hashHistory}> <Route path='/' component={App} > <IndexRoute component={Home} /><Route path='home' component={Home}/> <Route path='about' component={About}/> </Route> </Router>
IndexRoute 把{Home}组件设置为默认加载显示的子组件,及路径为“/”,那么Route /home就可以删除了,然后把导航的路径修改为“#/”即可。
<li><a href='#/home'>首页</a></li> <li><a href='#/'>首页</a></li>
1.7. IndexRedirect 组件(了解)
IndexRedirect组件用于访问根路由的时候,将用户重定向到某个子路由。浏览器地址将会改变为”#/home”.
import {IndexRedirect} from 'react-router'; <Route path="/" component={App}> <IndexRedirect to="home" /> <Route path="home" component={Home} /> <Route path="about" component={About} /> </Route>
上面代码中,用户访问根路径时,将自动重定向到子组件Home。
1.8. Link 链接
Link组件用于取代<a>元素,生成一个链接,允许用户点击后跳转到另一个路由。它基本上就是<a>元素的React 版本,可以接收Router的状态。
<ul>
<li><a href='#/'>首页</a></li>
<li><a href='#/about'>关于我们</a></li>
</ul>
与上面等价
import {Link} from 'react-router';
<ul>
<li><Link to='/'>首页</Link></li>
<li><Link to='about'>关于我们</Link></li>
</ul>
如果希望当前的路由与其他路由有不同样式,这时可以使用Link组件的activeStyle或activeClassName属性。
<li><Link to='/' activeStyle={{color:'orange'}} onlyActiveOnIndex={true}>首页</Link></li> <li><Link to='about' activeStyle={{color:'orange'}}>关于我们</Link></li>
上面代码中,当前页面的链接的style会包含color:’orange’。
<ul>
<li><Link to='/' activeClassName='active' onlyActiveOnIndex={true}>首页</Link></li>
<li><Link to='/about' activeClassName='active'>关于我们</Link></li>
</ul>
上面代码中,当前页面的链接的class会包含active。
onlyActiveOnIndex :如果为true,当前路径必须与路由路径完全匹配才为活动状态。默认为false,如果子路径为活动状态那么父路径也为活动,因为子路由路径总是包含父路由路径。
除了使用a、link标签之外导航到路由页面,也可以使用props中router对象,该属性是由路由器传入。
this.props.router.push("/about");
1.9. IndexLink 链接
如果链接到根路由/,不要使用Link组件,而要使用IndexLink组件。
这是因为对于根路由来说,activeStyle和activeClassName会失效,或者说总是生效,因为/会匹配任何子路由。而IndexLink组件会使用路径的精确匹配等效于<Link onlyActiveOnIndex={true}>。
<IndexLink to="/" activeClassName="active">首页</IndexLink>
1.10. 路由的回调
路由有三个回调函数:
onEnter(nextState, replace, callback?) 进入该路由时调用
onChange(prevState, nextState, replace, callback?) 当路由位置改变时调用,但路由本身不进入或离开。 例如,当路由的子项更改时,或当查询参数更改时,将调用此方法。
onLeave(prevState) 离开该路由时调用
<Route path='/about' component={About} onEnter={()=>{alert('你来了')}} onLeave={()=>{alert('你走了');}}/>
1.11. 异步路由
路由可以通过采用异步的方式加载组件,从而达到按需加载的目的,大大提供了程序的运行速度。
实现异步路由,提供getComponent(nextState, callback)即可:
function asyncGetComponent(nextState, cb){
//异步加载
require.ensure([], function (require) { //回调告诉路由器已经加载完毕 //null:没有错误 //require('./components/Async').default cb(null, require('./components/Async').default) }); }
<Route path='async' getComponent={asyncGetComponent} />
1.12. histroy 属性
Router组件的history属性,用来监听浏览器地址栏的变化,并将URL解析成一个地址对象,供 React Router 匹配。
history属性,一共可以设置三种值。
browserHistory
hashHistory(#)
createMemoryHistory
如果设为hashHistory,路由将通过URL的hash部分(#)切换,URL的形式类似localhost/#/about。
import { hashHistory } from 'react-router' render( <Router history={hashHistory} routes={routes} />, document.getElementById('app') )
如果设为browserHistory,浏览器的路由就不再通过hash完成了,而显示正常的路径localhsot/about,背后调用的是浏览器的History API。
import { browserHistory } from 'react-router' render( <Router history={browserHistory} routes={routes} />, document.getElementById('app') )
但是,这种情况需要对服务器改造。否则用户直接向服务器请求某个子路由,会显示网页找不到的404错误。
如果开发服务器使用的是webpack-dev-server,加上--history-api-fallback参数就可以了。
$ webpack-dev-server --inline --content-base . --history-api-fallback
createMemoryHistory主要用于服务器渲染。它创建一个内存中的history对象,不与浏览器URL互动。
const history = createMemoryHistory(location)
【10】react 之 react-router的更多相关文章
- 10分钟学会React Context API
Create-react-app来学习这个功能: 注意下面代码红色的即可,非常简单. 在小项目里Context API完全可以替换掉react-redux. 修改app.js import React ...
- 10 个打造 React.js App 的最佳 UI 框架
10 个打造 React.js App 的最佳 UI 框架 在本文中,我们将分享一些助你打造 React.js App 最佳的 UI 框架.它们具备你所需要的基本 React 组件,以及易用的 API ...
- React Navigation & React Native & React Native Navigation
React Navigation & React Native & React Native Navigation React Navigation https://facebook. ...
- 《React Native 精解与实战》书籍连载「React 与 React Native 简介」
此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...
- JavaScript 和 React,React用了大量语法糖,让JS编写更方便。
https://reactjs.org/docs/higher-order-components.htmlhttps://codepen.io/gaearon/pen/WooRWa?editors=0 ...
- 用react-service做状态管理,适用于react、react native
转载自:https://blog.csdn.net/wo_shi_ma_nong/article/details/100713151 . react-service是一个非常简单的用来在react.r ...
- GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频)
GraphQL + React Apollo + React Hook + Express + Mongodb 大型前后端分离项目实战之后端(19 个视频) GraphQL + React Apoll ...
- GraphQL + React Apollo + React Hook 大型项目实战(32 个视频)
GraphQL + React Apollo + React Hook 大型项目实战(32 个视频) GraphQL + React Apollo + React Hook 大型项目实战 #1 介绍「 ...
- react实战 : react 与 svg
有一个需求是这样的. 一个组件里若干个区块.区块数量不定. 区块里面是一个波浪效果组件,而这个一般用 SVG 做. 所以就变成了在 react 中使用 SVG 的问题. 首先是波浪效果需要的样式. . ...
- React学习笔记-1-什么是react,react环境搭建以及第一个react实例
什么是react?react的官方网站:https://facebook.github.io/react/下图这个就是就是react的标志,非常巧合的是他和我们的github的编辑器Atom非常相似. ...
随机推荐
- React 服务端渲染最佳解决方案
最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...
- react安装极其了解
全局安装react脚手架工具 首先全局进行安装:cnpm install create-react-app -g 查看是否安装完成:create-react-app 创建react项目:create- ...
- dynamic routing between captual
对于人脑 决策树形式 对于CNN 层级与层级间的传递 人在识别物体的时候会进行坐标框架的设置 CNN无法识别,只能通过大量训练 胶囊 :一个神经元集合,有一个活动的向量,来表示物体的各类信息,向量的长 ...
- wampserver怎么设置外网可访问
wampserver配置httpd.conf允许外网访问? 在电脑上开启wamp服务后,默认是禁止外部网络访问的,如果您想要同一局域网中的设备能够访问PC上的web项目,则需要对httpd.conf文 ...
- jQuery的select2下拉框的搜索功能(使用select2插件,方便简单)
第一步: 引入我们用使用的插件 jquery: select2: css: js: 第二步: 创建一个html页面,body内容: <div> <select class=" ...
- Compiler Error Message: CS0016: Could not write to output
打开网页是报错: Server Error in '/' Application. Compilation Error Description: An error occurred during th ...
- Cyclic Nacklace HDU - 3746 (kmp)
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 洛谷 P1736 创意吃鱼法(多维DP)
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 线性回归、逻辑回归(LR)
线性回归 回归是一种极易理解的模型,就相当于y=f(x),表明自变量 x 和因变量 y 的关系.最常见问题有如 医生治病时的望.闻.问.切之后判定病人是否生了什么病,其中的望闻问切就是获得自变量x,即 ...
- jxl教程图文详解
近来学习了下jxl的操作Excel报表功能,现有的API基本可以满足当前的需要,抽空做了一个学生成绩查询报表的例子. 先看效果图: 从图中可以看到这是一个交叉报表,横向到Q列,纵向有22行,全部是通过 ...