位置: 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计数器指令程序)

  • iphone11可以升级ios15吗(iphone11可以升级ios16.1.1吗)

    iphone11可以升级ios15吗(iphone11可以升级ios16.1.1吗)

  • 华为mate40pro忘记密码怎么解锁(华为mate40pro忘记开机密码怎么办)

    华为mate40pro忘记密码怎么解锁(华为mate40pro忘记开机密码怎么办)

  • 红米10xpro有无线充电吗(红米10x有无线充电吗?)

    红米10xpro有无线充电吗(红米10x有无线充电吗?)

  • 华为荣耀9与荣耀9x有差别吗(华为荣耀9荣耀10手机壳通用吗)

    华为荣耀9与荣耀9x有差别吗(华为荣耀9荣耀10手机壳通用吗)

  • 怎么把主空间应用转到隐私空间(怎么把主空间应用转到第二空间小米)

    怎么把主空间应用转到隐私空间(怎么把主空间应用转到第二空间小米)

  • 平板连接网络却用不了(为什么平板电脑连接上网络却无法上网)

    平板连接网络却用不了(为什么平板电脑连接上网络却无法上网)

  • sir是什么(sir是什么牌子)

    sir是什么(sir是什么牌子)

  • 怎么改图片格式为jpg(word怎么改图片格式)

    怎么改图片格式为jpg(word怎么改图片格式)

  • 有指纹和无指纹区别(有指纹和无指纹是什么意思)

    有指纹和无指纹区别(有指纹和无指纹是什么意思)

  • amd x4 740相当于什么(amd x4 740相当于i几)

    amd x4 740相当于什么(amd x4 740相当于i几)

  • 路由器延时严重怎么办(路由器延时严重怎么解决)

    路由器延时严重怎么办(路由器延时严重怎么解决)

  • 耗材余量错误是什么意思(耗材余量错误是什么意思芯片掉了)

    耗材余量错误是什么意思(耗材余量错误是什么意思芯片掉了)

  • 淘宝怎么设置密码锁不让别人看(淘宝怎么设置密码支付)

    淘宝怎么设置密码锁不让别人看(淘宝怎么设置密码支付)

  • a1586是什么版本(a1586是什么版本的苹果手机)

    a1586是什么版本(a1586是什么版本的苹果手机)

  • 电脑没网怎么连接手机热点(电脑没网怎么连接打印机)

    电脑没网怎么连接手机热点(电脑没网怎么连接打印机)

  • 在剪映里面怎么截掉不要的视频(在剪映里面怎么去掉图片中的字)

    在剪映里面怎么截掉不要的视频(在剪映里面怎么去掉图片中的字)

  • 淘宝延期收货怎样操作(淘宝延期收货后可以退货吗)

    淘宝延期收货怎样操作(淘宝延期收货后可以退货吗)

  • 华为gt2怎么下载应用(华为gt2怎么下载电子书)

    华为gt2怎么下载应用(华为gt2怎么下载电子书)

  • sin45度等于多少(sin60度等于多少)

    sin45度等于多少(sin60度等于多少)

  • 轻颜相机怎么拍一分钟以上的视频(轻颜相机怎么拍视频)

    轻颜相机怎么拍一分钟以上的视频(轻颜相机怎么拍视频)

  • qq安全扫描失败(qq安全扫描失败怎么回事)

    qq安全扫描失败(qq安全扫描失败怎么回事)

  • 股权app开发功能有哪些(app股权结构)

    股权app开发功能有哪些(app股权结构)

  • 快手收藏在哪(快手收藏在哪里找出来)

    快手收藏在哪(快手收藏在哪里找出来)

  • 个人所得税账务处理分录
  • 农机合作社项目复核报告
  • 科研材料怎么买
  • 企业是否可以查员工亲属关系
  • 印花税购销合同包括哪些
  • 厂家试驾车和经销商试驾车
  • 工程项目结算方式有哪几种
  • 企业重组个人股东个人所得税
  • 减半征税怎么算
  • 股权转让的公允价值
  • 培训的餐费入什么科目
  • 货币资金怎么核对账实相符
  • win7系统无法启用网络发现
  • 电脑qq音乐声音小怎么回事
  • 2021最新版眼保健视频
  • 收到收据的会计分录
  • 工厂院子里的地图怎么画
  • 小微企业可以享受六税两费吗
  • 国产linux系统有哪些
  • PHP:xml_set_start_namespace_decl_handler()的用法_XML解析器函数
  • php命令行执行文件
  • php字符串定义的三种方式
  • 企业所得税的税收筹划
  • react by
  • 普票销售方信息不完整可以用吗
  • smart局部变量
  • php如何实现分页功能
  • 如何快速使用验证码
  • vue思维导图怎么下载
  • ai绘画图片
  • 开具信用证费用由谁承担
  • react基础入门
  • 存货跌价准备确认损失
  • 先做凭证再付款
  • 留底税额怎么入账
  • 土地补偿款有哪些款项
  • javascript基础笔记
  • 个人注册公司是否可以免税
  • SQL Server 2005 DTS导入平面数据出现错误解决方案
  • 跨年发票两大原则
  • 未分配利润转增股本 企业所得税
  • 企业租车接送员工上下班
  • 预付工程款该怎么记账
  • 如何判定专利是否侵权
  • 隔月红票怎么开
  • 向客户收取贴纸费用怎么说
  • 关于合同履约成本的表述错误的有
  • 新政府会计制度固定资产核算
  • 学会整理内容
  • mysql5.7安装教程详细
  • centos7安装mysql并jdbc测试教程
  • 无法安装mysql数据库
  • Win10 Mobile 10536预览版用得越久越卡顿是怎么回事?
  • centos6.5共享文件夹
  • win8停止服务
  • winxp系统怎么设置默认账户登入
  • ubuntu搭建vsftp
  • win7应用程序无法正常启动
  • xp密码忘记了怎么办大神
  • 如何永久激活win11
  • win7右键设置方法
  • win7怎么使用打印机打印
  • div滚动条怎么设置
  • cocos2d游戏源码
  • jquery中哪个属性判断按钮是否被选择?
  • eclipse安转
  • js简单实现鼠标移动后面文字也移动
  • ajax里面的属性
  • jquery弹窗弹出一个页面
  • 禁用javascript后果
  • 菜鸟教程jstl
  • jquery插件开发方法
  • 常州国家税务局待遇
  • 海关进口增值税如何入账
  • 上海社保转出后查不到记录
  • 无锡税务app
  • 中行网银查询
  • 贵州电子税务局app下载
  • 甘肃税务局电子税务局官网电子发票怎么查询
  • 出口退税额与出口退税收入
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设