简介
本节中包含React-router
控制React SPA路由。
关于React-router
的详细使用,请查阅官方文档。
示例代码
1 | import React from 'react'; |
运行以上代码能正常运行,URL地址为http://hostname/#/pageRoute?_k=xxxx
,并在Console中看到以下警告1
Warning: [react-router] `Router` no longer defaults the history prop to hash history. Please use the `hashHistory` singleton instead. http://tiny.cc/router-defaulthistory
根据以上提示信息,给Router Component添加history属性 <Router history={hashHistory}>
,使用hashHistory前需要先在react-router模块中引入。
URL格式
- 想要使用
http://hostname/pageRoute
格式的URL地址,只需用browserHistory
替换掉hashHistory即可。 - 想要使用
http://hostname/projectName/pageRoute
格式的URL地址,需要引入useRouterHistory
和history
模块的createHistory
,然后添加如下代码1
2
3const history = useRouterHistory(createHistory)({
basename: '/projectName'
})
多级路由
本节需到的API:
- IndexRoute from react-router
多级路由需要将次级对应的<Route />
节点作为父级的字节点1
2
3
4
5
6
7
8<Router>
<Route path="/" component={App}>
<IndexRoute component={Index} />
<Route path="about" component={About}>
<Route path="author" component={Author} />
</Route>
</Route>
</Router>
并在父级component
中输出{this.props.children}
1
2
3
4
5
6
7
8
9
10class About extends React.Component {
render() {
return (
<div>
<h2>About</h2>
{this.props.children}
</div>
);
}
}
About Component
的文字出现在了/about/author
中,怎么才能让/about/author
不显示About Component
的内容呢?
这时候就要用到react-router
的另外一个Component IndexRoute
,使用方法和 Route
相同,修改后的代码如下1
2
3
4<Route path="about" component={About}>
<IndexRoute component={AboutIndex} />
<Route path="author" component={Author} />
</Route>
1 | class About extends React.Component { |
可变路由
当需要路由/user/gavin
/user/david
等这类有规律且对应的Component是同一个的时候,可设置路由规则为/user/:username
示例如下1
2
3
4<Route path="user" component={User}>
<IndexRoute component={UserIndex} />
<Route path=":username" component={UserCenter} />
</Route>
1 | class User extends React.Component { |
可以看出:username
对应的值在Component中通过this.props.params.username
获取。
Link
应用内部链接需要使用<Link />
代替<a href="">Link</a>
,具体使用方法参考官方文档。
生命周期
在1.x中提供了Mixin Lifecycle的方法,可以添加方法routerWillLeave
,当离开当前Component触发,2.x版本已不再建议。
在2.x中相同需求的实现方法如下1
2
3
4
5
6
7
8
9
10const RouteComponent = React.createClass({
contextTypes: {
router: React.PropTypes.object.isRequired
},
componentDidMount() {
const { route } = this.props
const { router } = this.context
router.setRouteLeaveHook(route, this.routerWillLeave)
}
});
Tips: 这里用 React.createClass
, 而不是继承React.Component将在下一节中学习。
其他
React Router 还提供了一些有用的Component/Function:
<Redirect/>
路由跳转以便兼容旧路由RouterContext
通过context.router
访问router的方法(具体的实现原理将在下一节中学习)withRouter
通过this.props.router
访问router的方法
Tips: router 类似于1.x的history,2.x不再推荐history和Mixins,后续版本可能会移除
参考链接
相关API参考 React Router Document
示例代码地址 Github