位置: IT常识 - 正文

React中路由的参数传递 - 路由的配置文件(react中路由有哪些常用组件)

编辑:rootadmin
React中路由的参数传递 - 路由的配置文件 文章目录路由的参数传递路由的配置文件路由的参数传递

推荐整理分享React中路由的参数传递 - 路由的配置文件(react中路由有哪些常用组件),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:react路由的原理,react路由传参数,react路由传参数,react路由exact,react项目路由配置,react路由表,react路由表,react中路由有哪些常用组件,内容如对您有帮助,希望把文章链接给更多的朋友!

传递参数有二种方式(需要注意的是, 这两种方式在Router6.x中都是提供的hook函数的API, 类组件需要通过高阶组件的方式使用):

动态路由的方式;

search传递参数(查询字符串);

方式一: 动态路由的概念指的是路由中的路径并不会固定:

比如/detail的path对应一个组件Detail;

如果我们将path在Route匹配时写成/detail/:id,那么 /detail/111、/detail/123都可以匹配到该Route,并且进行显示;

这个匹配规则,我们就称之为动态路由;

React中路由的参数传递 - 路由的配置文件(react中路由有哪些常用组件)

通常情况下,使用动态路由可以为路由传递参数。

配置动态路由render() { return ( <div className='app'> <div className='header'> <Link to="detail/123">详情123</Link> <Link to="detail/321">详情321</Link> <Link to="detail/aaa">详情aaa</Link> </div> <div className='counter'> <Routes> <Route path='/detail/:id' element={<Detail/>}/> </Routes> </div> <div className='footer'>footer</div> </div> )}在跳转的页面中可以通过hook函数useParms获取到传入的id, 由于我们现在使用的是类组件, 无法使用hook函数, 因此需要通过高阶组件对当前组件增强(上一篇刚刚讲过高阶组件的封装, 这里直接使用, 给到大家代码)import { useNavigate, useParams } from "react-router-dom"export default function withRouter(WrapperComponent) { return function(props) { const naviagte = useNavigate() const params = useParams() const router = {naviagte, params} return <WrapperComponent {...props} router={router} /> }}使用高阶组件增强当前Detail组件, 就可以通过useParams获取到传递的idimport React, { PureComponent } from 'react'import withRouter from '../hoc/with_router'export class Detail extends PureComponent { render() { // 获取到params const { params } = this.props.router return ( <div> <h2>Detail</h2> {/* 通过params获取到id并展示 */} <h2>id: {params.id}</h2> </div> ) }}export default withRouter(Detail)

方式二: search传递参数(也就是查询字符串的方式), 这里在User组件中进行演示

在路由跳转时拼接上查询字符串render() { return ( <div className='app'> <div className='header'> <Link to="/user?name=chenyq&age=18&height=1.88">用户</Link> </div> <div className='counter'> <Routes> <Route path='/user' element={<User/>} /> </Routes> </div> <div className='footer'>footer</div> </div> )}查询字符串需要通过hook函数useSearchParams获取, 所以我们也需要使用高阶组件对User组件进行增强// 封装的高阶组件import { useNavigate, useParams, useSearchParams } from "react-router-dom"export default function withRouter(WrapperComponent) { return function(props) { // 1.导航 const naviagte = useNavigate() // 2.动态路由的参数 const params = useParams() // 3.查询字符串的参数 const [searchParams] = useSearchParams() const query = Object.fromEntries(searchParams.entries) const router = {naviagte, params, query} return <WrapperComponent {...props} router={router} /> }}在组件中就可以获取到参数import React, { PureComponent } from 'react'import withRouter from '../hoc/with_router'export class User extends PureComponent { render() { // 获取高阶组件中的query const { query } = this.props.router return ( <div> <h2>User</h2> {/* 通过query获取参数 */} <h2>参数: {query.name}-{query.age}-{query.height}</h2> </div> ) }}export default withRouter(User)路由的配置文件

目前我们所有的路由定义都是直接使用Route组件,并且添加属性来完成的。

但是这样的方式会让路由变得非常混乱,我们希望像vue-router那样, 将所有的路由配置放到一个单独的文件进行集中管理:

在早期的时候,Router并且没有提供相关的API,我们需要借助于react-router-config完成;

在Router6.x中,为我们提供了useRoutes API可以完成相关的配置;

例如我们将下面的映射关系配置到一个单独的文件中

<div className='counter'> <Routes> {/* 当默认路径 / 时, 重定向到home页面 */} <Route path='/' element={<Navigate to="/home"/>}></Route> {/* 配置二级路由 */} <Route path='/home' element={<Home/>}> <Route path='/home' element={<Navigate to="/home/recommend"/>}/> <Route path='/home/recommend' element={<HomeRecommend/>}/> <Route path='home/ranking' element={<HomeRanking/>}/> </Route> <Route path='/about' element={<About/>}/> <Route path='/profile' element={<Profile/>}/> <Route path='/category' element={<Category/>}/> <Route path='/order' element={<Order/>}/> <Route path='/detail/:id' element={<Detail/>}/> <Route path='/user' element={<User/>} /> {/* 当上面路径都没有匹配到时, 显式Notfound组件 */} <Route path='*' element={<Notfound/>}/> </Routes></div>

首先, 使用useRoutes这个API替代原来的Routes和Route组件, useRoutes可以当成一个函数直接使用, 但是只能在函数组件中使用

<div className='counter'> {useRoutes(routes)}</div>

再在route/index.js中对映射关系进行配置

import { Navigate } from "react-router-dom"import Home from '../pages/Home'import About from '../pages/About'import Profile from '../pages/Profile'import Notfound from '../pages/Notfound'import HomeRecommend from '../pages/HomeRecommend'import HomeRanking from '../pages/HomeRanking'import Category from '../pages/Category'import Order from '../pages/Order'import Detail from '../pages/Detail'import User from '../pages/User'const routes = [ { path: "/", element: <Navigate to="/home"/> }, { path: "/home", element: <Home/>, children: [ { path: "/home", element: <Navigate to="/home/recommend" /> }, { path: "/home/recommend", element: <HomeRecommend/> }, { path: "/home/ranking", element: <HomeRanking/> } ] }, { path: "/about", element: <About/> }, { path: "/profile", element: <Profile/> }, { path: "/category", element: <Category/> }, { path: "/order", element: <Order/> }, { path: "detail/:id", element: <Detail/> }, { path: "/user", element: <User/> }, { path: "*", element: <Notfound/> }]export default routes

如果我们对某些组件进行了异步加载(懒加载, 分包处理),那么需要使用Suspense进行包裹:

例如我们对Detail和User进行懒加载(分包处理)

// import Detail from '../pages/Detail'// import User from '../pages/User'const Detail = React.lazy(() => import("../pages/Detail"))const User = React.lazy(() => import("../pages/User"))

并且还需要使用Suspense对组件进行包裹

root.render( <HashRouter> <Suspense fallback={<h3>loading</h3>}> <App/> </Suspense> </HashRouter>)
本文链接地址:https://www.jiuchutong.com/zhishi/293073.html 转载请保留说明!

上一篇:网站百度统计被恶意刷广告的处理方法(百度统计网址)

下一篇:bc命令 数字计算器(ab计数器指令程序)

  • 支付宝小鸡怎么不见了(支付宝小鸡怎么快速得到蛋)

    支付宝小鸡怎么不见了(支付宝小鸡怎么快速得到蛋)

  • 苹果13mini128g多少钱(苹果13mini128g多少钱官网价格)

    苹果13mini128g多少钱(苹果13mini128g多少钱官网价格)

  • cc388a硒鼓适用哪些打印机(硒鼓cc388a和cc388一样吗)

    cc388a硒鼓适用哪些打印机(硒鼓cc388a和cc388一样吗)

  • 迅雷怎么不能看视频了(迅雷怎么不能看广告获得下载权限)

    迅雷怎么不能看视频了(迅雷怎么不能看广告获得下载权限)

  • 苹果手机短信回声效果为什么对方看不了(苹果手机短信回执)

    苹果手机短信回声效果为什么对方看不了(苹果手机短信回执)

  • 手机如何给图片加边框(手机如何给图片添加文字)

    手机如何给图片加边框(手机如何给图片添加文字)

  • 朋友圈怎么只让一个人看(朋友圈怎么只让自己看到)

    朋友圈怎么只让一个人看(朋友圈怎么只让自己看到)

  • 小红书新手怎样增加粉丝(小红书新手怎样赚钱)

    小红书新手怎样增加粉丝(小红书新手怎样赚钱)

  • 苹果XR公开版什么意思(iphonexr移动版和公开版的区别)

    苹果XR公开版什么意思(iphonexr移动版和公开版的区别)

  • 台式电脑显示器闪屏是什么原因(台式电脑显示器曲屏好还是直屏好)

    台式电脑显示器闪屏是什么原因(台式电脑显示器曲屏好还是直屏好)

  • 表格怎么按数字大小排序(表格怎么按数字顺序拉下来)

    表格怎么按数字大小排序(表格怎么按数字顺序拉下来)

  • word文档表格如何调整行距(word文档表格如何调整宽度)

    word文档表格如何调整行距(word文档表格如何调整宽度)

  • 怎么取消拼多多连抽(怎么取消拼多多绑定的银行卡)

    怎么取消拼多多连抽(怎么取消拼多多绑定的银行卡)

  • 一加7T Pro怎么长截屏(一加七pro怎么长截屏)

    一加7T Pro怎么长截屏(一加七pro怎么长截屏)

  • u盘进水了还能复原吗(硬盘进水坏了数据可以恢复吗)

    u盘进水了还能复原吗(硬盘进水坏了数据可以恢复吗)

  • 荣耀20i怎么退出应用(荣耀20i怎么退出应用程序)

    荣耀20i怎么退出应用(荣耀20i怎么退出应用程序)

  • iphone怎么滚动截长图(iphone怎么滚动截屏)

    iphone怎么滚动截长图(iphone怎么滚动截屏)

  • ipad6th是什么型号(ipad6是哪个型号)

    ipad6th是什么型号(ipad6是哪个型号)

  • 微信转账的名字怎么取消(微信转账的名字是银行卡还是手机号)

    微信转账的名字怎么取消(微信转账的名字是银行卡还是手机号)

  • 滴滴出行行程单在哪(滴滴出行行程单怎么找)

    滴滴出行行程单在哪(滴滴出行行程单怎么找)

  • 苹果手机照片地点怎么删除(苹果手机照片地点封面怎么删除)

    苹果手机照片地点怎么删除(苹果手机照片地点封面怎么删除)

  • 手机照片模糊怎么能变清楚(手机照片模糊怎么变清晰)

    手机照片模糊怎么能变清楚(手机照片模糊怎么变清晰)

  • wifi上传速度慢解决方法(wifi上传速度为0的解决方法)

    wifi上传速度慢解决方法(wifi上传速度为0的解决方法)

  • 典当行借款合同需交印花税吗
  • 房产租赁增值税率是5%还是9%
  • 民办非企业不注销的法律后果
  • 在建工程累计摊销会计分录
  • 纳税人财务会计报表报送管理办法
  • 房产企业贷款利率
  • 帮客户代付保证金违法吗
  • 拖欠供应商货款
  • 一年内到期的非流动负债包括哪些科目
  • 支付股权投资的会计科目
  • 租入生物性资产如何入账
  • 一般纳税人确认收入含税吗
  • 上缴税费总额包括个税吗?
  • 工程开票是否需要资质?
  • 资产负债表应交税费计算公式
  • 企业的其他业务收入主要核算
  • 税务代开的专票未取票,逾期会作废吗?
  • 纳税人不得汇总开具发票
  • 怎么处理有问题的货物
  • 支付外汇代扣代缴增值税
  • edge浏览器下载安装
  • win10提示病毒防护已过期
  • win11任务栏如何设置在最左边
  • 应收应付款有零头怎么处理
  • php红包源码
  • 增值税一般纳税人资格登记表
  • 微软 Windows x64 仿真正式推出,只支持 Win11 ARM
  • 怎么做好零售
  • 五金企业成本核算方法
  • 收到银行退回的会计分录
  • 转让应收账款会计分录
  • php官方微信接口有哪些
  • 乐吾实验学校网站
  • 股权融资的第六步
  • 程序员未来会失业吗
  • web前端期末大作业旅游页面
  • 什么叫存量比率
  • 经营租入固定资产账务处理
  • 营业税金及附加会计分录
  • 电子税务局怎么注册
  • 企业计提养老保险分录
  • 什么是企业的应付账款
  • 个人所得税既有工资薪金又有劳务报酬房屋租金
  • 不借助的英文
  • 工资是负数怎么办
  • 托盘入账哪个科目最好
  • 投资性房地产的后续计量
  • 完税证明可以做为证据使用吗
  • 通过SQLServer 2008 操作 MySQL的方法
  • mysql操作步骤
  • 没有参加会计继续教育会怎样
  • 定额备用金怎么做分录
  • 固定资产如何计提折旧
  • 进项留抵月末要结转吗
  • 有限合伙企业协议
  • 营改增之后是不是就没有营业税了
  • 投资性房地产公允价值模式转为成本模式
  • 一般纳税人销售使用过的固定资产
  • 原材料暂估的账务处理
  • 国库单一账户体系包括哪些账户
  • sql储存过程
  • 存储过程怎么理解
  • windows8使用教程
  • win10怎么添加
  • 开启windows远程桌面服务
  • ubuntu服务
  • ubuntu server initramfs
  • win7系统怎么重置网络
  • driver's
  • win8系统安装条件
  • win10电源选项
  • 被调用的对象已与其客户端断开连接怎么办
  • system命令行
  • js实现浏览器状态栏显示
  • js如何使用
  • js水平垂直居中怎么设置
  • python魔法方法详解
  • jquery 获取屏幕高度
  • 西乡国税局电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设