1、Switch的使用
<div className="panel-body">
{/*注册路由*/}
<Switch>
<Route path="/about" component={About}/>
<Route path="/home" component={Home}/>
<Route path="/home" component={Test}/>
</Switch>
</div>
2、路由的模糊匹配
只要NavLink的to路径值包含了路由路径,就能给路由路径访问相应的组件
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
{/*编写路由连接*/}
<NavLink className="list-group-item" to="/about">About</NavLink>
<NavLink className="list-group-item" to="/home">Home</NavLink>
<MyNavLink to="/about">About</MyNavLink>
<MyNavLink to="/home/a/b">Home</MyNavLink>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
{/*注册路由*/}
<Switch>
<Route path="/about" component={About}/>
<Route path="/home" component={Home}/>
<Route path="/home" component={Test}/>
</Switch>
</div>
以上代码依然能正常访问,这就是模糊匹配
如果要开启严格匹配模式则需要添加exact属性
<div className="panel-body">
{/*注册路由*/}
<Switch>
<Route exact path="/about" component={About}/>
<Route exact path="/home" component={Home}/>
</Switch>
</div>
3、redirect的使用
需要导入Redirect模块
import {NavLink,Route,Switch,Redirect} from 'react-router-dom'
Redirect相当于兜底,所有路由都不匹配的时候,就匹配Redirect指定的路由
<div className="panel-body">
{/*注册路由*/}
<Switch>
<Route exact path="/about" component={About}/>
<Route exact path="/home" component={Home}/>
<Redirect to="/home"/>
</Switch>
</div>
4、嵌套路由
app.js
import React, { Component } from 'react'
import {NavLink,Route,Switch,Redirect} from 'react-router-dom'
import Home from './components/Home'
import About from './components/About'
import Header from './pages/Header'
import MyNavLink from './components/MyNavLink'
export default class App extends Component {
render () {
return (
<div>
<div className="row">
<div className="col-xs-offset-2 col-xs-8">
<div className="page-header">
<Header/>
</div>
</div>
</div>
<div className="row">
<div className="col-xs-2 col-xs-offset-2">
<div className="list-group">
{/*编写路由连接*/}
<NavLink className="list-group-item" to="/about">About</NavLink>
<NavLink className="list-group-item" to="/home">Home</NavLink>
<MyNavLink to="/about">About</MyNavLink>
<MyNavLink to="/home">Home</MyNavLink>
</div>
</div>
<div className="col-xs-6">
<div className="panel">
<div className="panel-body">
{/*注册路由*/}
<Switch>
<Route path="/about" component={About}/>
<Route path="/home" component={Home}/>
<Redirect to="/about"/>
</Switch>
</div>
</div>
</div>
</div>
</div>
)
}
}
Home/index.js
import React, { Component } from 'react'
import News from './News'
import Message from './Message'
import MyNavLink from '../MyNavLink'
import {Route,Switch} from 'react-router-dom'
class Home extends Component {
render () {
return (
<div>
<h2>Home组件内容</h2>
<div>
<ul className="nav nav-tabs">
<li>
<MyNavLink to="/home/news">News</MyNavLink>
</li>
<li>
<MyNavLink to="/home/message">Message</MyNavLink>
</li>
</ul>
{/*注册路由*/}
<Switch>
<Route>
<News path="/home/news" component={News}/>
<Message path="/home/message" component={Message}/>
</Route>
</Switch>
</div>
</div>
)
}
}
export default Home
5、向路由组件传递参数–params参数
Message/index.js
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>
</li>
)
})
}
</ul>
<hr/>
{/*声明接受params参数*/}
<Route path="/home/message/detail/:id/:title" component={Detail}/>
</div>
)
}
Message/Detail/index.js
import React, { Component } from 'react'
const DeatilData=[
{id:'01',content:'听他说又再抢购尚敏'},
{id:'02',content:'尚敏时候又要打报告了'},
{id:'03',content:'天天就这点事,烦死了'}
]
class Detail extends Component {
render () {
const {id,title}= this.props.match.params
const findResult=DeatilData.find((detailObj)=>{
return detailObj.id===id
})
console.log(this.props)
return (
<ul>
<li>ID:{id}</li>
<li>Title:{title}</li>
<li>content:{findResult.content}</li>
</ul>
)
}
}
export default Detail
6、向路由组件传递参数–Search参数
需要引入一个‘querystring’库
Message/index.js
import React, { Component } from 'react'
import Detail from './Detail'
import {Link,Route} from 'react-router-dom'
class Message extends Component {
state={
messageArr:[
{id:'01',title:'消息1'},
{id:'02',title:'消息2'},
{id:'03',title:'消息3'},
]
}
render () {
const {messageArr}=this.state
return (
<div>
<ul>
{
messageArr.map((msgObj)=>{
return(
<li key={msgObj.id}>
{/*向路由组件传递search参数*/}
<Link to={`/home/message/detail/?id=${msgObj.id}&title=${msgObj.title}`}>{msgObj.title}</Link>
</li>
)
})
}
</ul>
<hr/>
{/*声明接受search参数,search参数无需声明接收,正常注册路由即可*/}
<Route path="/home/message/detail" component={Detail}/>
</div>
)
}
}
export default Message
Message/Detail/index.js
import React, { Component } from 'react'
import qs from 'querystring'
const DeatilData=[
{id:'01',content:'听他说又再抢购尚敏'},
{id:'02',content:'尚敏时候又要打报告了'},
{id:'03',content:'天天就这点事,烦死了'}
]
class Detail extends Component {
render () {
console.log(this.props)
//接受search参数
const {search}=this.props.location
const {id,title}=qs.parse(search.slice(1))
const findResult=DeatilData.find((detailObj)=>{
return detailObj.id===id
})
console.log(this.props)
return (
<ul>
<li>ID:{id}</li>
<li>Title:{title}</li>
<li>content:{findResult.content}</li>
</ul>
)
}
}
export default Detail
7、向路由组件传递参数–state参数
state参数不在地址栏出现
Message/index.js
import React, { Component } from 'react'
import Detail from './Detail'
import {Link,Route} from 'react-router-dom'
class Message extends Component {
state={
messageArr:[
{id:'01',title:'消息1'},
{id:'02',title:'消息2'},
{id:'03',title:'消息3'},
]
}
render () {
const {messageArr}=this.state
return (
<div>
<ul>
{
messageArr.map((msgObj)=>{
return(
<li key={msgObj.id}>
{/*向路由组件传递state参数*/}
<Link to={{pathname:'/home/message/detail',state:{id:msgObj.id,title:msgObj.title}}}>{msgObj.title}</Link>
</li>
)
})
}
</ul>
<hr/>
{/*声明接受state参数,state参数无需声明接收,正常注册路由即可*/}
<Route path="/home/message/detail" component={Detail}/>
</div>
)
}
}
export default Message
Message/Detail/index.js
import React, { Component } from 'react'
const DeatilData=[
{id:'01',content:'听他说又再抢购尚敏'},
{id:'02',content:'尚敏时候又要打报告了'},
{id:'03',content:'天天就这点事,烦死了'}
]
class Detail extends Component {
render () {
//接受state参数
const {id,title}=this.props.location.state || {}
const findResult=DeatilData.find((detailObj)=>{
return detailObj.id===id
}) || {}
console.log(this.props)
return (
<ul>
<li>ID:{id}</li>
<li>Title:{title}</li>
<li>content:{findResult.content}</li>
</ul>
)
}
}
export default Detail
8、push与replace
默认开启push模式
开启repalce需要在Link标签内设置replace属性:
<ul>
{
messageArr.map((msgObj)=>{
return(
<li key={msgObj.id}>
{/*向路由组件传递state参数*/}
<Link replace={true} to={{pathname:'/home/message/detail',state:{id:msgObj.id,title:msgObj.title}}}>{msgObj.title}</Link>
</li>
)
})
}
</ul>
9、编程式路由导航
以下例子总报replace错误
使用history对象上的各种方法
1、携带params参数
import React, { Component } from 'react'
import Detail from './Detail'
import {Link,Route} from 'react-router-dom'
class Message extends Component {
state={
messageArr:[
{id:'01',title:'消息1'},
{id:'02',title:'消息2'},
{id:'03',title:'消息3'},
]
}
replaceShow=(id,title)=>{
//实现跳转到detail组件,且为replace跳转+携带params参数
this.props.history.replace(`/home/message/detail/${id}/${title}`)
}
pushShow=(id,title)=>{
//实现跳转到detail组件,且为replace跳转
//this.props.history.push(`/home/message/detail/${id}/${title}`)
this.props.history.push(`/home/message/detail/?id=${id}&title=${title}`)
}
render () {
const {messageArr}=this.state
return (
<div>
<ul>
{
messageArr.map((msgObj)=>{
return(
<li key={msgObj.id}>
{/*向路由组件传递state参数*/}
<Link to={`/home/message/detail/${msgObj.id}/${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/>
{/*声明接受state参数,state参数无需声明接收,正常注册路由即可*/}
<Route path="/home/message/detail/:id/:title" component={Detail}/>
</div>
)
}
}
export default Message
2、携带search参数
import React, { Component } from 'react'
import Detail from './Detail'
import {Link,Route} from 'react-router-dom'
class Message extends Component {
state={
messageArr:[
{id:'01',title:'消息1'},
{id:'02',title:'消息2'},
{id:'03',title:'消息3'},
]
}
replaceShow=(id,title)=>{
//实现跳转到detail组件,且为replace跳转+携带params参数
//this.props.history.replace(`/home/message/detail/${id}/${title}`)
//且为replace跳转+携带search参数
this.props.history.replace(`/home/message/detail/?id=${id}&title=${title}`)
}
pushShow=(id,title)=>{
//实现跳转到detail组件,且为replace跳转
//this.props.history.push(`/home/message/detail/${id}/${title}`)
this.props.history.push(`/home/message/detail/?id=${id}&title=${title}`)
}
render () {
const {messageArr}=this.state
return (
<div>
<ul>
{
messageArr.map((msgObj)=>{
return(
<li key={msgObj.id}>
{/*向路由组件传递state参数*/}
{/*<Link replace={true} to={{pathname:'/home/message/detail',state:{id:msgObj.id,title:msgObj.title}}}>{msgObj.title}</Link>*/}
{/*<Link to={`/home/message/detail/${msgObj.id}/title=${msgObj.title}`}>{msgObj.title}</Link>*/}
<Link to={`/home/message/detail/?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/>
{/*声明接受state参数,state参数无需声明接收,正常注册路由即可*/}
<Route path="/home/message/detail" component={Detail}/>
</div>
)
}
}
export default Message
detail.js
import React, { Component } from 'react'
import qs from 'querystring'
const DeatilData=[
{id:'01',content:'听他说又再抢购尚敏'},
{id:'02',content:'尚敏时候又要打报告了'},
{id:'03',content:'天天就这点事,烦死了'}
]
class Detail extends Component {
render () {
//接受state参数
//const {id,title}=this.props.location.state || {}
//接受search参数
const {search}=this.props.location
const {id,titile}=qs.parse(search.slice(1))
const findResult=DeatilData.find((detailObj)=>{
return detailObj.id===id
})
console.log(this.props)
return (
<ul>
<li>ID:{id}</li>
<li>Title:{title}</li>
<li>content:{findResult.content}</li>
</ul>
)
}
}
export default Detail
3、携带state参数
import React, { Component } from 'react'
import Detail from './Detail'
import {Link,Route} from 'react-router-dom'
class Message extends Component {
state={
messageArr:[
{id:'01',title:'消息1'},
{id:'02',title:'消息2'},
{id:'03',title:'消息3'},
]
}
replaceShow=(id,title)=>{
//实现跳转到detail组件,且为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:id,title:title})
}
pushShow=(id,title)=>{
//实现跳转到detail组件,且为replace跳转
//this.props.history.push(`/home/message/detail/${id}/${title}`)
//this.props.history.push(`/home/message/detail/?id=${id}&title=${title}`)
this.props.history.push(`/home/message/detail/`,{id:id,title:title})
}
render () {
const {messageArr}=this.state
return (
<div>
<ul>
{
messageArr.map((msgObj)=>{
return(
<li key={msgObj.id}>
{/*向路由组件传递state参数*/}
<Link to={{pathname:'/home/message/detail',state:{id:msgObj.id,title:msgObj.title}}}>{msgObj.title}</Link>
{/*<Link to={`/home/message/detail/${msgObj.id}/title=${msgObj.title}`}>{msgObj.title}</Link>*/}
{/*<Link to={`/home/message/detail/?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/>
{/*声明接受state参数,state参数无需声明接收,正常注册路由即可*/}
<Route path="/home/message/detail" component={Detail}/>
</div>
)
}
}
export default Message
detail.js
import React, { Component } from 'react'
import qs from 'querystring'
const DeatilData=[
{id:'01',content:'听他说又再抢购尚敏'},
{id:'02',content:'尚敏时候又要打报告了'},
{id:'03',content:'天天就这点事,烦死了'}
]
class Detail extends Component {
render () {
//接受state参数
const {id,title}=this.props.location.state || {}
//接受search参数
// const {search}=this.props.location
// const {id,title}=qs.parse(search.slice(1))
const findResult=DeatilData.find((detailObj)=>{
return detailObj.id===id
}) || {}
console.log(this.props)
return (
<ul>
<li>ID:{id}</li>
<li>Title:{title}</li>
<li>content:{findResult.content}</li>
</ul>
)
}
}
export default Detail
10、withRouter
一般组件使用路由组件的api使用withRouter包裹类名
const {withRouter} form ‘react-router-dom’
export default withRouter(Header)