react(尚硅谷)06-Switch的使用,路由模糊匹配,重定向,嵌套路由,向路由组件传递params、search、state参数,push与replace,编程式路由导航,withRouter

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)

在这里插入图片描述

10、BrowerRouter和HashRouter

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值