先把版本写在前面
"react-router-dom": "^4.2.2"
以前就得版本使用Context
对象来控制路由,现在新版本改了用history
了
使用导航在react-router-dom
提供了两个控件BrowserRouter
和HashRouter
都可以实现导航,区别看这里 这篇手记的demo中使用的是BrowserRouter
先上代码
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import registerServiceWorker from './registerServiceWorker';
import AppRoutes from "./AppRoutes";
import {
BrowserRouter,
} from 'react-router-dom';
ReactDOM.render(<BrowserRouter>
{AppRoutes}
</BrowserRouter>, document.getElementById('root'));
registerServiceWorker();
- 先从
react-router-dom
导入需要的BrowserRouter
控件
ReactDOM.render(<BrowserRouter>
{AppRoutes}
</BrowserRouter>, document.getElementById('root'));
- 将
BrowserRouter
做为最底层控件
AppRoutes.js
import {
Route,
} from 'react-router-dom';
import App from './App';
import Page1 from './Page1';
import Page2 from './Page2';
/**
* Routes: https://github.com/reactjs/react-router/blob/master/docs/API.md#route
*
* Routes are used to declare your view hierarchy.
*
* Say you go to http://material-ui.com/#/components/paper
* The react router will search for a route named 'paper' and will recursively render its
* handler and its parent handler like so: Paper > Components > Master
*/
const AppRoutes = (
<div>
<Route exact path="/" component={App}/>
<Route path="/page1" component={Page1}/>
<Route path="/page2" component={Page2}/>
</div>
);
export default AppRoutes;
const AppRoutes = (
<div>
<Route exact path="/" component={App}/>
<Route path="/page1" component={Page1}/>
<Route path="/page2" component={Page2}/>
</div>
);
- exact控制匹配到/路径时不会再继续向下匹配,path标识路由的路径,component表示路径对应显示的组件。
- 创建了三个路径,首页(http://localhost:3000/) -> App 、page1(http://localhost:3000/page1) -> Page1、page2(http://localhost:3000/page2) -> Page2
- 也可以index.js中的{AppRoutes}直接替换成上面的代码,这里这么写是为了方便项目管理
到这儿路已经铺好了,下一步就是使用了
App.js
import React, { Component } from 'react';
import {
Link
} from 'react-router-dom';
var dic = {
name:"hello",
value:"world",
}
class App extends Component {
render() {
return (
<div className="App">
App
<div>
<Link to={
{pathname:"/page1",
state:{data:dic}}
}> Page1</Link>
</div>
</div>
);
}
}
export default App;
-
第一种方法使用
react-router-dom
中的<Link>
控件1、 跳转到page1页面,只跳转不传值,可以这样
<Link to= "/page1">to Page</Link>
2、跳转并传值
<Link to={
{pathname:"/page1",
state:{data:dic}}
}> Page1</Link>
这时候需要传一个字典
- pathname:跳转页路径
- 给下一页传的值,这个键值对可以随意写,key值不一定是
data
,可以随意写,但是这里的key值是什么,下个页面也对应要用这个key值来取值.
除了这个<Link>
还有一个<NavLink>
跟这个意思差不多,不写了
-
第二种方法应该是最常用的了,history 控制路由跳转
page1.js
import React, { Component } from 'react';
import {
Link,
} from 'react-router-dom';
var args = "one world one dream";
var data="";
class Page1 extends Component {
constructor(props){
super(props);
//获取上个页面传过来的值
/*
* data是state中的一个字段,因为app.js传过来的值对应的key是data,所以这里这么写
* */
data = this.props.location.state.data;
}
componentDidMount(){
console.log(this.props.location.state.data);
}
toNextPage=()=>{
//使用history的push方法,实现跳转
this.props.history.push({
pathname:"/page2",
state:{args:args}
});
};
render() {
return (
<div >
Page1 <br/>
{"App说:"+ data.name+data.value}
<div>
{/*使用Link控件跳转*/}
<Link to={
{pathname:"/page2",
state:{args:args}}
}> Page2</Link>
</div>
{/*使用history的push方法,实现跳转*/}
<button onClick={()=>this.toNextPage()}>
去下一页
</button>
</div>
);
}
}
// export default withRouter(Page1);
export default Page1
toNextPage() 方法即我们需要的方法
toNextPage=()=>{
//使用history的push方法,实现跳转
this.props.history.push({
pathname:"/page2",
state:{args:args}
});
};
history
被放在props
属性下,push跳转到下一页push
中的参数和<Link>
控件设置方法一样
传参结束了,该获取了
page1.js中
constructor(props){
super(props);
//获取上个页面传过来的值
/*
* data是state中的一个字段,因为app.js传过来的值对应的key是data,所以这里这么写
* */
data = this.props.location.state.data;
}
哦了!跳转,传值,取值都说完了,应该够用了,demo下载
#参考资料