当前位置: 首页 > news >正文

React 全栈体系(十一)

第五章 React 路由

五、向路由组件传递参数数据

1. 效果

请添加图片描述

2. 代码 - 传递 params 参数

2.1 Message
/* src/pages/Home/Message/index.jsx */
import React, { Component } from "react";
import {Link, Route} from 'react-router-dom'
import Detail from './Detail'export default class Message extends Component {state = {messageArr: [{id:'01', title: '消息1'},{id:'02', title: '消息2'},{id:'03', title: '消息3'},]}render() {const {messageArr} = this.statereturn (<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>);}
}
2.2 Detail
/* src/pages/Home/Message/Detail/index.jsx */
import React, { Component } from 'react'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.paramsconst findResult = Detaildata.find((detailObj)=>{return detailObj.id === id})return (<ul><li>ID:{id}</li><li>Title:{title}</li><li>Content: {findResult.content}</li></ul>)}
}

3. 代码 - 传递 search 参数

3.1 Message
/* src/pages/Home/Message/index.jsx */
import React, { Component } from "react";
import {Link, Route} from 'react-router-dom'
import Detail from './Detail'export default class Message extends Component {state = {messageArr: [{id:'01', title: '消息1'},{id:'02', title: '消息2'},{id:'03', title: '消息3'},]}render() {const {messageArr} = this.statereturn (<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></li>)})}</ul><hr />{/* 声明接收params参数 */}{/* <Route path="/home/message/detail/:id/:title" component={Detail}/> */}{/* search参数无需声明接收,正常注册路由即可 */}<Route path="/home/message/detail" component={Detail}/></div>);}
}
3.2 Detail
/* src/pages/Home/Message/Detail/index.jsx */
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.locationconst {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>)}
}

4. 代码 - 传递 state 参数

4.1 Message
/* src/pages/Home/Message/index.jsx */
import React, { Component } from "react";
import {Link, Route} from 'react-router-dom'
import Detail from './Detail'export default class Message extends Component {state = {messageArr: [{id:'01', title: '消息1'},{id:'02', title: '消息2'},{id:'03', title: '消息3'},]}render() {const {messageArr} = this.statereturn (<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></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>);}
}
4.2 Detail
/* src/pages/Home/Message/Detail/index.jsx */
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>)}
}

5. 总结

1.params参数路由链接(携带参数)<Link to='/demo/test/tom/18'}>详情</Link>注册路由(声明接收)<Route path="/demo/test/:name/:age" component={Test}/>接收参数:this.props.match.params2.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备注:刷新也可以保留住参数

6. 代码 - push 与 replace 模式

Message
/* src/pages/Home/Message/index.jsx */
import React, { Component } from "react";
import {Link, Route} from 'react-router-dom'
import Detail from './Detail'export default class Message extends Component {state = {messageArr: [{id:'01', title: '消息1'},{id:'02', title: '消息2'},{id:'03', title: '消息3'},]}render() {const {messageArr} = this.statereturn (<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 replace 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>);}
}

六、多种路由跳转方式

1. 效果

请添加图片描述

2. 代码 - 跳转 + 携带 params 参数

2.1 Message
/* src/pages/Home/Message/index.jsx */
import React, { Component } from "react";
import { Link, Route } from "react-router-dom";
import Detail from "./Detail";export default class Message extends Component {state = {messageArr: [{ id: "01", title: "消息1" },{ id: "02", title: "消息2" },{ id: "03", title: "消息3" },],};pushShow = (id, title) => {//push跳转+携带params参数this.props.history.push(`/home/message/detail/${id}/${title}`)}replaceShow = (id, title) => {//replace跳转+携带params参数this.props.history.replace(`/home/message/detail/${id}/${title}`)}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;<button onClick={()=>this.pushShow(msgObj.id, msgObj.title)}>push查看</button>&nbsp;<button onClick={()=>this.replaceShow(msgObj.id, msgObj.title)}>replace查看</button></li>);})}</ul><hr />{/* 声明接收params参数 */}<Route path="/home/message/detail/:id/:title" component={Detail} /></div>);}
}
2.2 Detail
/* src/pages/Home/Message/Detail/index.jsx */
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.paramsconst findResult = Detaildata.find((detailObj)=>{return detailObj.id === id}) || {}return (<ul><li>ID:{id}</li><li>Title:{title}</li><li>Content: {findResult.content}</li></ul>)}
}

3. 代码 - 跳转 + 携带 state 参数

3.1 Message
/* src/pages/Home/Message/index.jsx */
import React, { Component } from "react";
import { Link, Route } from "react-router-dom";
import Detail from "./Detail";export default class Message extends Component {state = {messageArr: [{ id: "01", title: "消息1" },{ id: "02", title: "消息2" },{ id: "03", title: "消息3" },],};pushShow = (id, title) => {//push跳转+携带state参数this.props.history.push(`/home/message/detail`, {id,title})}replaceShow = (id, title) => {//replace跳转+携带state参数this.props.history.replace(`/home/message/detail`, {id,title})}render() {const { messageArr } = this.state;return (<div><ul>{messageArr.map((msgObj) => {return (<li key={msgObj.id}>{/* 向路由组件传递params参数 */}<Link to={{pathname:'/home/message/detail',state:{id:msgObj.id, title:msgObj.title}}}>{msgObj.title}</Link>&nbsp;<button onClick={()=>this.pushShow(msgObj.id, msgObj.title)}>push查看</button>&nbsp;<button onClick={()=>this.replaceShow(msgObj.id, msgObj.title)}>replace查看</button></li>);})}</ul><hr />{/* 声明接收state参数 */}<Route path="/home/message/detail" component={Detail} /></div>);}
}
3.2 Detail
/* src/pages/Home/Message/Detail/index.jsx */
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.location.stateconst findResult = Detaildata.find((detailObj)=>{return detailObj.id === id})return (<ul><li>ID:{id}</li><li>Title:{title}</li><li>Content: {findResult.content}</li></ul>)}
}

4. 代码 - 前进后退

/* src/pages/Home/Message/index.jsx */
import React, { Component } from "react";
import { Link, Route } from "react-router-dom";
import Detail from "./Detail";export default class Message extends Component {state = {messageArr: [{ id: "01", title: "消息1" },{ id: "02", title: "消息2" },{ id: "03", title: "消息3" },],};pushShow = (id, title) => {//push跳转+携带state参数this.props.history.push(`/home/message/detail`, { id, title });};replaceShow = (id, 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参数 */}<Linkto={{pathname: "/home/message/detail",state: { id: msgObj.id, title: msgObj.title },}}>{msgObj.title}</Link>&nbsp;<button onClick={() => this.pushShow(msgObj.id, msgObj.title)}>push查看</button>&nbsp;<buttononClick={() => this.replaceShow(msgObj.id, msgObj.title)}>replace查看</button></li>);})}</ul><hr />{/* 声明接收state参数 */}<Route path="/home/message/detail" component={Detail} /><button onClick={this.back}>回退</button>&nbsp;<button onClick={this.forward}>前进</button>&nbsp;<button onClick={this.go}>go</button></div>);}
}

5. 总结

借助this.prosp.history对象上的API对操作路由跳转、前进、后退-this.prosp.history.push()-this.prosp.history.replace()-this.prosp.history.goBack()-this.prosp.history.goForward()-this.prosp.history.go()

6. withRouter 的使用

Header
/* src/components/Header/index.jsx */
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() {console.log('Header组件收到的props是',this.props);return (<div className="page-header"><h2>React Router Demo</h2><button onClick={this.back}>回退</button>&nbsp;<button onClick={this.forward}>前进</button>&nbsp;<button onClick={this.go}>go</button></div>)}
}export default withRouter(Header)//withRouter可以加工一般组件,让一般组件具备路由组件所特有的API
//withRouter的返回值是一个新组件

请添加图片描述

七、BrowserRouter 与 HashRouter 的区别

1.底层原理不一样:BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。HashRouter使用的是URL的哈希值。
2.path表现形式不一样BrowserRouter的路径中没有#,例如:localhost:3000/demo/testHashRouter的路径包含#,例如:localhost:3000/#/demo/test
3.刷新后对路由state参数的影响(1).BrowserRouter没有任何影响,因为state保存在history对象中。(2).HashRouter刷新后会导致路由state参数的丢失!!!
4.备注:HashRouter可以用于解决一些路径错误相关的问题。
http://www.lryc.cn/news/171141.html

相关文章:

  • AI 时代的向量数据库、关系型数据库与 Serverless 技术丨TiDB Hackathon 2023 随想
  • Vue的路由使用,Node.js下载安装及环境配置教程 (超级详细)
  • vue修改node_modules打补丁步骤和注意事项
  • CSS 响应式设计:媒体查询
  • Qt开发 - Qt基础类型
  • Docker-如何获取docker官网x86、ARM、AMD等不同架构下的镜像资源
  • Vuex状态管理最佳实践
  • platform和led中断项目
  • R语言-关于颜色
  • 抖音seo优化排名源码搭建
  • pytorch的卷积层池化层和非线性变化 和机器学习线性回归
  • Java手写快速选择算法应用拓展案例
  • js制作柱状图的x轴时间, 分别展示 月/周/日 的数据
  • 安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR下级海康设备无法级联是什么原因?
  • HttpUtils带连接池
  • 智慧养殖:浅谈视频监控与AI智能识别技术助力奶牛高效、智慧养殖
  • 一文总结提示工程框架,除了CoT还有ToT、GoT、AoT、SoT、PoT
  • Java面试笔试acm版输入
  • 新手怎样快速上手接口测试?掌握这几个知识点直接起飞!
  • IDEA 启动 java web 老项目
  • 软路由和硬路由的区别是什么,性价比与可玩性分析
  • 《TCP/IP网络编程》阅读笔记--多线程服务器端的实现
  • 修改el-card的header的背景颜色
  • ubuntu系统中查看打开的端口
  • Datax从mysql同步数据到HDFS
  • 使用 Selenium 或其他工具模拟浏览器使用及语法代码
  • 华为手机如何开启设置健康使用手机模式限制孩子玩手机时间?
  • 【Linux】线程池 | 自旋锁 | 读写锁
  • [网鼎杯 2020 青龙组]bang 题解
  • 创建环境时提示:ERROR conda.core.link:_execute(502)