前言
??欢迎来到我的博客??
?博主是一名大学在读本科生,主要学习方向是前端?。
?目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏?
?目前正在学习的是? R e a c t 框架 React框架 React框架?,中间夹杂了一些基础知识的回顾⌨️
?博客主页?codeMak1r.的博客
??本文目录??
前言向路由组件传递params参数向路由组件传递search参数向路由组件传递state参数总结路由参数本文被专栏【React–从基础到实战】收录
?坚持创作✏️,一起学习?,码出未来???!
向路由组件传递params参数
示例:
localhost:3000/home/message/detail/01/message001。不点击时,路由组件Detail不显示;例如,点击导航栏对应的message001,则Detail组件显示内容为message001对应内容。路由组件Detail是一个通用组件,内部显示什么内容由点击的导航栏决定;点击哪一个导航,就将哪一个导航的内容通过params传递给Detail组件。例如,点击message002,将message002的id与title传入Detail组件,以供Detail组件显示对应002这个id的CONTENT内容。
项目结构
src
├─App.jsx├─index.js├─pages| ├─Home| | ├─index.jsx| | ├─News| | | └index.jsx| | ├─Message| | | ├─index.jsx| | | ├─Detail| | | | └index.jsx| ├─About| | └index.jsx├─components| ├─MyNavLink| | └index.jsx| ├─Header| | └index.jsx
【分割线】
public
├─favicon.ico├─index.html├─css| └bootstrap.css
示例重点在于:Message组件本身是一个路由组件,其又是Detail组件的父组件,在Message组件中注册Detail子组件,点击导航栏对应链接,将对应的message消息内容传递给子路由组件Detail。然后Detail接收到父路由组件Message传递的params参数,将内容显示在页面对应位置中。
接下来展示Message与Detail组件源码:
Message组件源码:
import React, { Component } from 'react'import { Route, Link } from 'react-router-dom'import Detail from './Detail'export default class Message extends Component { state = { messageArr: [ { id: '01', title: 'message001' }, { id: '02', title: 'message002' }, { id: '03', title: 'message003' }, ] } render() { return ( <div> <ul> { this.state.messageArr.map((msgObj) => { return ( <li key={msgObj.id}> {/* 向Detail路由组件传递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> ) }}
Detail组件源码:
import React, { Component } from 'react'const Detaildata = [ { id: '01', content: '你好,中国!' }, { id: '02', content: '你好,李焕英!' }, { id: '03', content: '你好,China!' }]export default class Detail extends Component { render() { const { match: { params: { id, title } } } = this.props const findContent = Detaildata.find((detailObj) => { return detailObj.id === id }) return ( <ul> <li>ID:{id}</li> <li>TITLE:{title}</li> <li>CONTENT:{findContent.content}</li> </ul> ) }}
Home组件源码:
import React, { Component } from 'react'import { Route, Switch, Redirect } from 'react-router-dom'import Message from './Message'import News from './News'import MyNavLink from '../../components/MyNavLink'export default class Home extends Component { render() { // console.log('Home', this.props) return ( <div> <h3>我是Home组件内容</h3> <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 path="/home/news" component={News} /> <Route path="/home/message" component={Message} /> <Redirect to="/home/news" /> </Switch> </div> </div> ) }}
路由组件传参——params总结:
在路由链接中向路由组件传递params参数
<Link to={`/home/message/detail/${msgObj.id}/${msgObj.title}`}> {msgObj.title}</Link>
注册路由(声明接收params参数)
{/* 声明接收params参数 */}<Route path="/home/message/detail/:id/:title" component={Detail} />
在路由组件中接受参数,路由组件的this.props.match.params中就可以接收到上级组件传递过来的params参数。
const { match: { params: { id, title } } } = this.props// 连续解构赋值
向路由组件传递search参数
上面我们学会了向路由组件传递params参数示例,我们还是运用这个示例,去体验一下向路由组件传递search参数。
{/* 向路由组件传递search参数 */}<Link to={`/home/message/detail/?id=${msgObj.id}&title=${msgObj.title}`}> {msgObj.title}</Link>
向路由组件Detail传递search参数,比如点击message001,就将message001的id与title传入Detail组件的this.props.location.search中
在传递search参数时,不需要声明接收,只需要正常注册路由:
<Route path="/home/message/detail" component={Detail} />
但是我们发现,this.props.location.search接收到的search参数是urlencoded格式的。
我们可以借助一个库,将urlencoded格式转化为object对象形式,从而拿到我们需要的id与title。
// 安装query-string库npm i --save --include=dev query-string //windowsudo npm i --save --include=dev query-string //MAC// 引入query-stringimport qs from 'query-string'
// 将object转化为urlencodedqs.stringify()// 将urlencoded转化为objectqs.parse()
// 接收search参数const { location: { search } } = this.propsconst { id, title } = qs.parse(search)
Detail组件源码:
import React, { Component } from 'react'import qs from 'query-string'const Detaildata = [ { id: '01', content: '你好,中国!' }, { id: '02', content: '你好,李焕英!' }, { id: '03', content: '你好,China!' }]export default class Detail extends Component { render() { console.log(this.props) // 接收search参数 const { location: { search } } = this.props const { id, title } = qs.parse(search) const findContent = Detaildata.find((detailObj) => { return detailObj.id === id }) return ( <ul> <li>ID:{id}</li> <li>TITLE:{title}</li> <li>CONTENT:{findContent.content}</li> </ul> ) }}
路由组件传参——search总结:
在路由链接中向路由组件传递search参数
{/* 向路由组件传递search参数 */}<Link to={`/home/message/detail/?id=${msgObj.id}&title=${msgObj.title}`}> {msgObj.title}</Link>
正常注册路由(无需声明接收search参数)
<Route path="/home/message/detail" component={Detail} />
在路由组件中接受参数,路由组件的this.props.location.search中就可以接收到上级组件传递过来的search参数。
由于接受的search参数是urlencoded编码字符串,我们需要借助query-string这个库进行格式转换。
// 接收search参数const { location: { search } } = this.propsconst { id, title } = qs.parse(search)
向路由组件传递state参数
上面学会了向路由组件传递params以及search参数,接下来还是运用这个案例去讲解向路由组件传递state参数。
{/* 向路由组件传递state参数 */}{/* state参数是一个对象,对象有两个属性pathname和state */}Link to={{ pathname: '/home/message/detail', state: { id: msgObj.id, title: msgObj.title } }}> {msgObj.title}</Link>
我们可以看到,传递的state参数是一个对象,对象有两个属性分别是:pathname以及state。
参数就放在state这个对象中。
需要注意的是,⚠️state参数不显示在url地址栏中,而之前学习的params参数以及search参数都会在url地址栏中显示。
state参数与search参数一样,不需要声明接收,正常注册组件就好。
{/* 注册路由 */}{/* state参数无需声明接收 */}<Route path="/home/message/detail" component={Detail} />
那么接收state参数时,依旧是在this.props之中,this.props.location.state这个属性上有一个对象,对象中就是上级组件传递进路由组件的state参数。
我们的Detail路由组件可以这样接收state参数:
import React, { Component } from 'react'const Detaildata = [ { id: '01', content: '你好,中国!' }, { id: '02', content: '你好,李焕英!' }, { id: '03', content: '你好,China!' }]export default class Detail extends Component { render() { console.log(this.props) // 接收state参数 const { location: { state: { id, title } } } = this.props const findContent = Detaildata.find((detailObj) => { return detailObj.id === id }) return ( <ul> <li>ID:{id}</li> <li>TITLE:{title}</li> <li>CONTENT:{findContent.content}</li> </ul> ) }}
路由组件传参——state总结:
在路由链接中向路由组件传递state参数
{/* 向路由组件传递state参数 */}{/* state参数是一个对象,对象有两个属性pathname和state */}Link to={{ pathname: '/home/message/detail', state: { id: msgObj.id, title: msgObj.title } }}> {msgObj.title}</Link>
正常注册路由(无需声明接收state参数)
{/* 注册路由 */}{/* state参数无需声明接收 */}<Route path="/home/message/detail" component={Detail} />
在路由组件中接受参数,路由组件的this.props.location.state中就可以接收到上级组件传递过来的state参数。
// 接收state参数const { location: { state: { id, title } } } = this.props
总结路由参数
向路由组件传递参数 | 声明接收参数 | 接受参数 | |
---|---|---|---|
params | /demo/test/tom/18 | /demo/test/:name/:age | this.props.match.params |
search | /demo/test?name=tom&age=18 | /demo/test (无需声明接收参数) | this.props.location.search |
state | { pathname:‘/demo/test’, state:{name:‘tom’,age:18} } | /demo/test (无需声明接收参数) | this.props.location.state |
??今天的小知识就分享到这里啦
如果觉得博主的文章还不错的话
可以给博主一个免费的关注,如果三连点赞?收藏支持的话就更好了
✏️原创不易你的支持将会是我最大的动力?
?感谢观看