编程式路由导航
5.编程式路由导航
1.push和replace模式
{/* 路由模式改成replace替换 , 默认为push堆栈 */}
<Link replace to={{pathname: '/home/message/detail', state:{id:msgObj.id, title: msgObj.title}}}>{msgObj.title}</Link>
2.编程式路由导航
import React, {Component} from 'react';
import {Link, Route} from "react-router-dom";
import Detail from "./Detail";
class Message extends Component {
state = {
messageArr: [
{id: '01', title: '消息1'},
{id: '02', title: '消息2'},
{id: '03', title: '消息3'},
]
}
pushShow = (id, title) => {
// 编写一段代码,让其 实现跳转到Detail组件,且为push跳转
// push跳转+携带params参数
// this.props.history.push(`/home/message/detail/${id}/${title}`)
// push跳转+携带search参数
// this.props.history.push(`/home/message/detail/?id=${id}&title=${title}`)
// push跳转+携带state参数
this.props.history.push(`/home/message/detail`,{id,title})
}
replaceShow = (id, title) => {
// 编写一段代码,让其 实现跳转到Detail组件,且为replace跳转
// replace跳转+携带params参数
// this.props.history.replace(`/home/message/detail/${id}/${title}`)
// replace跳转+携带search参数
// this.props.history.replace(`/home/message/detail/?id=${id}&title=${title}`)
// replace跳转+携带state参数
this.props.history.replace(`/home/message/detail`,{id,title})
}
// 后退
back = () => {
this.props.history.goBack()
}
// 前进
forward = () => {
this.props.history.goForward()
}
// 跳转
go = () => {
this.props.history.go(2)
}
render() {
const {messageArr} = this.state
return (
<div>
<ul>
{
messageArr.map(msgObj => {
return (
<li key={msgObj.id}>
{/*向路由组件传递params参数*/}
{/*<Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link>*/}
{/*向路由组件传递search参数*/}
{/*<Link to={`/home/message/detail?id=${msgObj.id}&title=${msgObj.title}`}>{msgObj.title}</Link>*/}
{/*向路由组件传递state参数*/}
<Link to={{pathname: '/home/message/detail', state:{id:msgObj.id, title: msgObj.title}}}>{msgObj.title}</Link>
<button onClick={() => {this.pushShow(msgObj.id, msgObj.title)}}>push查看</button>
<button onClick={() => {this.replaceShow(msgObj.id, msgObj.title)}}>replace查看</button>
</li>
)
})
}
</ul>
<hr/>
{/*声明接收params参数*/}
{/*<Route path='/home/message/detail/:id/:title' component={Detail}/>*/}
{/*search参数无需声明接收, 正常注册路由即可*/}
{/*<Route path='/home/message/detail' component={Detail}/>*/}
{/*state参数无需声明接收, 正常注册路由即可*/}
<Route path='/home/message/detail' component={Detail}/>
<button onClick={this.back}>回退</button>
<button onClick={this.forward}>前进</button>
<button onClick={this.go}>GO</button>
</div>
);
}
}
export default Message;
3.withRouter的使用
import React, {Component} from 'react';
import {withRouter} from "react-router-dom";
class Header extends Component {
back = () => {
this.props.history.goBack()
}
forward = () => {
this.props.history.goForward()
}
go = () => {
this.props.history.go(2)
}
render() {
return (
<div className="page-header">
<h2>React Router Demo</h2>
<button onClick={this.back}>回退</button>
<button onClick={this.forward}>前进</button>
<button onClick={this.go}>GO</button>
</div>
);
}
}
// withRouter可以加工一般组件,让一般组件具备路由组件所持有的API
// withRouter的返回值是一个新组件
export default withRouter(Header);