向路由传递参数

133 篇文章 7 订阅
51 篇文章 0 订阅

params参数 方法

import React, { Component } from 'react'
import {Link,Route} from 'react-router-dom'
import Detail from './Detail'

export default class index 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}>
                  <Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link>&nbsp;&nbsp;
                </li>
              )
            })
          }
        </ul>
        <hr />
        <Route path="/home/message/detail/:id/:title" component={Detail}/>
      </div>
    )
  }
}

通过 /${msgObj.id}/${msgObj.title} 传递参数
通过 /:id/:title 接收参数

import React, { Component } from 'react'

const DetailData = [
  {id:"01",content:"你好,中国"},
  {id:"02",content:"你好,小宝"},
  {id:"03",content:"你好,未来的自己"}
]
export default class Detail extends Component {
  render() {
    const { id, title } = this.props.match.params
    const findResult = DetailData.find((detailObj) => {
      return detailObj.id ===id
    })
    return (
      <ul>
        <li>ID{id}</li>
        <li>TITLE:{title}</li>
        <li>CONTENT:{findResult.content}</li>
      </ul>
    )
  }
}

const findResult = DetailData.find((detailObj) => {
return detailObj.id ===id
})
根据id来进行判断 返回 detailObj中满足条件的对象

seach参数 方法

import React, { Component } from 'react'
import {Link,Route} from 'react-router-dom'
import Detail from './Detail'

export default class index 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参数 无需声明接收,正常注册路由即可 */}
        <Route path="/home/message/detail" component={Detail} />
      </div>
    )
  }
}

import React, { Component } from 'react'
import qs from 'querystring'

const DetailData = [
  {id:"01",content:"你好,中国"},
  {id:"02",content:"你好,小宝"},
  {id:"03",content:"你好,未来的自己"}
]
export default class Detail extends Component {
  render() {
    // 接收params参数
    // const { id, title } = this.props.match.params
    // 接收search参数
    const { search } = this.props.location
    const { id,title }  = qs.parse(search.slice(1))
    const findResult = DetailData.find((detailObj) => {
      return detailObj.id === id
    })
    return (
      <ul>
        <li>ID{id}</li>
        <li>TITLE:{title}</li>
        <li>CONTENT:{findResult.content}</li>
      </ul>
    )
  }
}

需要用qs 来将 ?id=01&title="消息1"转换成对象的形式{id:01,title=“消息1”} 此时需要用到slice(1)来将?截取掉
search参数 无需声明接收,正常注册路由即可

state参数 方法

import React, { Component } from 'react'
// import qs from 'querystring'

const DetailData = [
  {id:"01",content:"你好,中国"},
  {id:"02",content:"你好,小宝"},
  {id:"03",content:"你好,未来的自己"}
]
export default class Detail extends Component {
  render() {
    // 接收params参数
    // const { id, title } = this.props.match.params
    // 接收search参数
    // const { search } = this.props.location
    // const { id,title }  = qs.parse(search.slice(1))
    // 接收state参数
    const { id, title } = this.props.location.state || {}
    
    const findResult = DetailData.find((detailObj) => {
      return detailObj.id === id
    })|| {}
    return (
      <ul>
        <li>ID{id}</li>
        <li>TITLE:{title}</li>
        <li>CONTENT:{findResult.content}</li>
      </ul>
    )
  }
}

import React, { Component } from 'react'
import {Link,Route} from 'react-router-dom'
import Detail from './Detail'

export default class index 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}>
                  {/* 向路由传递params参数  */}
                  {/* <Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}>{msgObj.title}</Link>&nbsp;&nbsp; */}

                  {/* 向路由传递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>
                </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} />
      </div>
    )
  }
}

<Link to={{pathname:'/home/message/detail',state:{id:msgObj.id,title:msgObj.title}}}>{msgObj.title }</Link> to 赋值需要用对象形式
const { id, title } = this.props.location.state 接收参数时需要在 this.props.location.state中查找

总结

1.params参数
	路由链接(携带参数)<Link to='/demo/test/tom/18'}>详情</Link>
	注册路由(声明接收)<Route path="/demo/test/:name/:age" component={Test}/>
	接收参数:this.props.match.params
2.search参数
	路由链接(携带参数)<Link to='/demo/test?name=tom&age=18'}>详情</Link>
	注册路由(无需声明,正常注册即可)<Route path="/demo/test" component={Test}/>
	接收参数:this.props.location.search
	备注:获取到的search是urlencoded编码字符串,需要借助querystring解析
3.state参数
	路由链接(携带参数)<Link to={{pathname:'/demo/test',state:{name:'tom',age:18}}}>详情</Link>
	注册路由(无需声明,正常注册即可)<Route path="/demo/test" component={Test}/>
	接收参数:this.props.location.state
	备注:刷新也可以保留住参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bliss小宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值