React路由参数传递与嵌套路由的实现详细讲解
1. 页面路由参数传递
1.1 动态路由参数
描述:
以“/detail/:id”形式传递的数据,在落地组件中通过this.props.match.params得到。
使用:
App.jsx:
import React, { Component } from 'react' import { Route, Link, NavLink, Switch, Redirect } from 'react-router-dom' // 匹配成功后渲染的组件 import Home from './views/Home' import About from './views/About' import Detail from './views/Detail' import Notfound from './views/Notfound' class App extends Component { render() { return ( <div> <h3>App组件</h3> <div> <NavLink exact to="/">Home</NavLink>--- <NavLink to="/about">About</NavLink> </div> <hr /> <Route path="/home" component={Home} /> <Route path="/about" component={About} /> {/* /detail/1 /detail/2 ... 匹配成功;参数可以传递多个 */} <Route path="/detail/:id/:name?" component={Detail} /> <Redirect exact from="/" to="/home" /> <Route component={Notfound} /> </Switch> </div> ) } } export default App
about页面:
import React, { Component } from 'react' import { Link } from 'react-router-dom' class About extends Component { render() { return ( <div> <h3>关于我们</h3> <hr /> <ul> {Array(10) .fill('') .map((_, index) => ( <li key={index}> <Link to={`/detail/${index}?`}>新闻 -- {index}</Link> </li> ))} </ul> </div> ) } } export default About
详情页面:
import React, { Component } from 'react' class Detail extends Component { render() { // 获取动态路由参数 对象 let id = this.props.match.params.id || 0 return ( <div> <h3>详情页面 --- {id}</h3> </div> ) } } export default Detail
1.2 search字符串
描述:
通过地址栏中的 ?key=value&key=value传递。
使用:
关于页面:
import React, { Component } from 'react' import { Link } from 'react-router-dom' class About extends Component { render() { return ( <div> <h3>关于我们</h3> <hr /> <ul> {Array(10) .fill('') .map((_, index) => ( <li key={index}> <Link to={`/detail/${index}?age=${2 + index}`}>新闻 -- {index}</Link> </li> ))} </ul> </div> ) } } export default About
详情页面:
import React, { Component } from 'react' import qs from 'querystring' // 封装一个方法,获取数据 // String.prototype.toSearch = function () { // let searchData = {} // const search = new URLSearchParams(this) // search.forEach((value, key) => { // searchData[key] = value // }) // return searchData // } class Detail extends Component { render() { // 获取动态路由参数 对象 let id = this.props.match.params.id || 0 // search字符串 字符串 console.log(this.props.location.search) // 将字符串转为对象 console.log(qs.parse(this.props.location.search.slice(1))) // 如果用search字符串,推荐用它 const search = new URLSearchParams(this.props.location.search) // 获取就字段数据 console.log(search.get('age')) let searchData = {} search.forEach((value, key) => { searchData[key] = value }) console.log(searchData) // 使用迭代对象获取 // for (let [key, value] of search.entries()) { // searchData[key] = value // } // console.log(searchData) // 使用封装的方法获取 // console.log(this.props.location.search.toSearch()) return ( <div> <h3>详情页面 --- {id}</h3> </div> ) } } export default Detail
1.3 页面参数隐式传递
描述:
隐式传参(state),通过地址栏是观察不到的;通过路由对象中的state属性进行数据传递,在落地组件中通过this.props.location.state得到。
使用:
home页面:
import React, { Component } from 'react' import { Link } from 'react-router-dom' class Home extends Component { jumpDetail = () => { this.props.history.push({ pathname: '/detail', search: 'name=zhangsan', state: { id: 200 } }) } render() { return ( <div> <div> {/* 通过state隐式来传递数据到目标页面 */} <Link to={{ pathname: '/detail', state: { id: 100 }, search: 'name=lisi' }}>去详情</Link> </div> <hr /> {/* 编程式导航 */} <button onClick={this.jumpDetail}>去详情页</button> </div> ) } } export default Home
详情页面:
import React, { Component } from 'react' class Detail extends Component { render() { // 获取页面隐式传过来的state数据 对象 console.log(this.props.location.state) console.log(this.props.location.search.toSearch()) return ( <div> <h3>详情页面</h3> </div> ) } } export default Detail
tosearch方法(已导入入口文件中,所以可以直接使用):
String.prototype.toSearch = function () { let searchData = {} if (this.toString() != '') { const search = new URLSearchParams(this.toString()) search.forEach((value, key) => { searchData[key] = value }) } return searchData }
2. 嵌套路由
后台首页:
import React, { Component } from 'react' import { NavLink, Redirect, Route, Switch } from 'react-router-dom' import { AdminContainer } from './style' import Index from '../Index' import User from '../User' class Admin extends Component { render() { // 在子路由定义的组件中,可以通过props中提供的路由对象来获取父路由定义的地址 // let parentRoutePath = this.props.match.path return ( <AdminContainer> <h3>后台首页</h3> <div> <ul> <li> <NavLink to="/admin/index">后台首页</NavLink> </li> <li> <NavLink to="/admin/user">用户列表</NavLink> </li> </ul> <div> <Switch> <Route path='/admin/index' component={Index} /> <Route path='/admin/user' component={User} /> <Redirect from='/admin' to='/admin/index' /> </Switch> </div> </div> </AdminContainer> // <AdminContainer> // <h3>后台首页</h3> // <div> // <ul> // <li> // <NavLink to={`${parentRoutePath}/index`}>后台首页</NavLink> // </li> // <li> // <NavLink to={`${parentRoutePath}/user`}>用户列表</NavLink> // </li> // </ul> // <div> // <Switch> // <Route path={`${parentRoutePath}/index`} component={Index} /> // <Route path={`${parentRoutePath}/user`} component={User} /> // <Redirect exact from={parentRoutePath} to={`${parentRoutePath}/index`} /> // </Switch> // </div> // </div> // </AdminContainer> ) } } export default Admin
到此这篇关于React路由参数传递与嵌套路由的实现详细讲解的文章就介绍到这了,更多相关React路由参数传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
React antd中setFieldsValu的简便使用示例代码
form.setFieldsValue是antd Form组件中的一个方法,用于动态设置表单字段的值,它接受一个对象作为参数,对象的键是表单字段的名称,值是要设置的字段值,这篇文章主要介绍了React antd中setFieldsValu的简便使用,需要的朋友可以参考下2023-08-08ahooks useVirtualList 封装虚拟滚动列表
这篇文章主要为大家介绍了ahooks useVirtualList 封装虚拟滚动列表详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-09-09解决react-connect中使用forwardRef遇到的问题
这篇文章主要介绍了解决react-connect中使用forwardRef遇到的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-05-05
最新评论