使用react-router进行多级路由匹配

React实战 ---- 路由配置及多级导航切换路由 在管理系统这类项目中,比较常见的设计还是这样的。 404页面,宣传主页,登录页面,注册页面,找回密码页面单独处理。 而系统内部就需要统一管理了,不仅仅要管理用户信息 token的有效性,为了良好的用户体验,我们还有需要使用二级路由。 老规矩,先上源码Liz606/webpack-es6-react 讲解在这里:手把手带你搭建与配置Webpack + ES6 + React开发环境 这时我们就需要... 阅读详情

在React-router学习笔记 react-router基本使用中,我做了精确的路由匹配,但是实际上,我们在进行路由匹配的时候,一般是会进行多级路由的匹配,所以这里说说如何进行多级路由的匹配

在使用react-router-dom的Link的时候,我们需要使用to来指定路由,而Route用来显示路由对应得内容,默认情况下,Route 会进行路由的模糊匹配

<Route path="/topics" component={Topics}></Route>

上面的这个Route,在路由为/topics时可以显示,在路由为/topics/str时也可以显示(str随机的字符串),所以我们可以利用这个特点,让该Route对应的组件在显示多级路由内容时也可以显示
简单的代码如下

import React from 'react'
import ReactDOM from 'react-dom'
import { BrowserRouter as Router,Route,Link } from 'react-router-dom'

class AppRouter extends React.Component{
    render(){
        return(
            <Router>
                <RouterLink />
                <RouterShow />
            </Router>
        )
    }
}

class RouterLink extends React.Component{
    render(){
        return(
            <>
                <li>
                    <Link to="/">HOME</Link>
                </li>
                <li>
                    <Link  to="/about">ABOUT</Link>
                </li>
                <li>
                    <Link  to="/topics">TOPICS</Link>
                </li>
            </>
        )
    }
}

class RouterShow extends React.Component{
    render(){
        return(
            <> 
                <Route exact path="/" component={Home} />
                <Route exact path="/about" component={About} />
                <Route path="/topics" component={Topics} />
            </>
        )
    }
}

class Home extends React.Component{
    render(){
        return(
            <div>
                <h1>this is Home page</h1>
            </div>
        )
    }
}

class About extends React.Component{
    render(){
        return (
            <div>
                <h1>this is About page</h1>
            </div>
        )
    }
}

class Topics extends React.Component{
    render(){
        return (
            <div>
                <h1>this is Topics page</h1>
                <hr/>
                <div>
                    <li>
                        <Link to="/topics/topic1">topic1</Link>
                    </li>
                    <li>
                        <Link  to="/topics/topic2">topic2</Link>
                    </li>
                    <li>
                        <Link  to="/topics/topic3">topic3</Link>
                    </li>
                </div>
                <hr/>
                <div>
                    <Route path="/topics/topic1" component={Topic1}/>
                    <Route path="/topics/topic2" component={Topic2} />
                    <Route path="/topics/topic3" component={Topic3}/>
                </div>
            </div>
        )
    }
}

class Topic1 extends React.Component{
    render(){
        return <p>here is topic1</p>
    }
}
class Topic2 extends React.Component{
    render(){
        return <p>here is topic2</p>
    }
}
class Topic3 extends React.Component{
    render(){
        return <p>here is topic3</p>
    }
}

ReactDOM.render(<AppRouter />, document.getElementById('root'))

上面的代码固然实现了效果,但是显然,很多内容显得过于冗余了,三个子Topic组件看起来很是类似,只是显示的内容有点不一样,我们是不是可以尝试使用一个组件,然后在父组件传值进来显示呢,答案当然是可以的,我们可以通过props来获取父组件的内容,也可以通过props来获取url的内容
我们将Topic1组件修改成下面这样子,打印出props

class Topic1 extends React.Component{
    constructor(props){
        super(props);
        console.log(props)
    }
    render(){
        return <p>here is topic1</p>
    }
}

观察打印内容,可以看到props.match中就有相应的路由,我们可以通过获取对应的url,来修改子组件的内容(这里url和path是一样的,使用path的理由会在下面提及)
在这里插入图片描述
但是这样子的话,我们还需要将path对应的字符串的前缀路由去掉,才能匹配到我们真正想要的topic1,我们要想个办法来更好地获取我们要的内容
在Route中,我们可以通过:的写法,来将路由对应的内容,反映到params的属性上,我们修改三个Route

<Route path="/topics/:topicName" component={Topic1}/>
<Route path="/topics/:topicName" component={Topic2} />
<Route path="/topics/:topicName" component={Topic3}/>

重新看以下控制台的打印内容
在这里插入图片描述
我们发现,params已经不再是一个空对象了,而且里面的属性的key,正是我们写在:后面的内容,而key对应的内容,正是子路由的内容
同时这里我们也看到了path和url的不同了,url是真实的路由,而path是我们写在Route上的path属性的值。
回归正题,既然我们可以通过这种方式来获得想应的内容,那我们就可以对我们写的代码进行优化了,将三个子Topic组件合成一个,获取props.match的内容来修改子组件的内容,三个Route也可以合成一个了

<Route path="/topics/:topicName" component={Topic}/>

class Topic extends React.Component{
    constructor(props){
        super(props);
        console.log(props)
    }
    render(){
        return <p>here is {this.props.match.params.topicName}</p>
    }
}

这部分优化完后,我们看看别的部分,我们发现,每次写子组件时,都要记住父组件对应的路由,写在每个Link和Route里面,万一路由进行修改,那相关的子组件也要修改,很不利于维护,所以我们要采用别的方式
其实我们要做的和上面是一样的,通过props的内容来进行路由跳转,我们将props的内容写入Link和Route中,要注意的是在Link中写入path,在Route中写入url,实际上文档中也这么写了
在这里插入图片描述
所以修改代码如下

class Topics extends React.Component{
    render(){
        return (
            <div>
                <h1>this is Topics page</h1>
                <hr/>
                <div>
                    
                    <li>
                        <Link to={`${this.props.match.path}/topic1`}>topic1</Link>
                    </li>
                    <li>
                        <Link to={`${this.props.match.path}/topic2`}>topic2</Link>
                    </li>
                    <li>
                        <Link to={`${this.props.match.path}/topic3`}>topic3</Link>
                    </li>
                </div>
                <hr/>
                <div>
                    <Route path={`${this.props.match.url}/:topicName`} component={Topic}/>
                </div>
            </div>
        )
    }
}

至此基本完成多级路由匹配的优化

07_React 路由 1、一个路由就是一个映射关系(key:value)2、key 为路径,value 可能是 function 或 component1、默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序一致)2、开启严格匹配3、严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由。 阅读详情

相关推荐

react实现同页面三级跳转路由布局

主要为大家详细介绍了react实现同页面三级跳转路由布局,一个路由小案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

react安裝使用,父子兄弟传值,三种路由传参详解,组件的生命周期

一:使用安装 二:父子间传值:

weixin_52005030的博客 458

【无标题】STM32F767串口空闲中断+DMA实现不定帧长度的接收

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、配置串口与DMA二、空闲中断服务函数二.串口+DMA发送三、主函数总结 前言 提示:这里可以添加本文要记录的大概内容: 使用STM32F767实现串口空闲中断+DMA传输接收不定帧长度数据,以及当中可能遇到的错误总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、配置串口与DMA //硬件模块配置可直接通过CUBEMX配置 void MX_USART1_UART_Init(void) { huart1.In.

qq_42589531的博客 1168

React-router-dom@6.x 多路由嵌套

React-router-dom@6.x 多路由嵌套 本文会以三级路由为例讲解最新版本的React-router-dom多级路由嵌套配置 你需要有一定的reac基础 三级路由数据结构 const routes = [ { id: 0, compontent: Home, path: '/home', title: '租房APP', children: [ { id: 11, path: 'news', com

helgeal的博客 2766

离合器KP点自学习:从原理到工程实践的全景解析

本文全面解析了离合器KP点自学习的原理与工程实践,详细介绍了KP点的物理本质、控制价值及自学习方法。通过扭矩增量式和转速变化式学习法,结合不同变速箱构型的适配策略,提升离合器控制的精度与效率。文章还探讨了液压系统迟滞补偿和摩擦材料老化应对方案,为工程实践提供可靠保障。

weixin_33717117的博客 287

洪水风险图制作全流程:HEC-RAS 与 ArcGIS 的耦合应用

本文系统介绍HEC-RAS水动力模拟软件在水利工程中的应用技术。内容涵盖:1)软件理论与安装;2)一维地形数据导入与河网构建;3)恒定流/非恒定流计算及模型调试要点;4)构筑物建模技术(桥梁、堰闸等);5)二维水动力模拟与溃坝分析;6)洪水风险图绘制。重点讲解水面线调试、糙率选取、报错分析等实操难点,通过案例教学实现从基础到工程应用的全流程技术掌握。该培训适用于防洪评价、河道治理等水利工程数值模拟需求。

2403_89974123的博客 1053

react多级权限路由

技术栈:react-router-dom、react18、antd、vite-plugin-mock。

qq_47040462的博客 757

IC 时钟设计核心问题与高质量系统设计指南(附源码)

本文深入探讨了IC时钟设计的核心问题与高质量系统设计方法。时钟系统作为IC的"心脏",其性能直接影响时序稳定性、功耗效率和可靠性。文章从五个维度展开分析:时钟源选择与性能匹配、时钟分配网络设计、抖动抑制、多时钟域管理和功耗优化。针对高质量时钟系统设计,提出了时钟源优化、时钟树结构优化、干扰抑制与仿真验证等具体方法。同时,系统阐述了时钟与复位的协同设计关系,强调异步复位同步释放等技术的重要性。文章还总结了高质量IC系统设计的综合要点,包括电源/信号完整性、时序功耗平衡、可靠性设计及全流程验

Open 1061

react 多级路由 子路由切换

需求案例: 1.当我们在后台管理页面 左侧菜单栏的情况下 2.点击左侧菜单栏 路由变化 右侧内容区域变化 如图: 点击分布式表单出现右侧内容 分布式表单步骤条 3.第一步的路由 为 "form/step-form/step1" 4.当我们输入完成验证通过 点击下一步 路由为 "form/step-form/step2" 4.当我们 点击继续路由为 "form/step-form/step3" 需求简化就是一个 第三级菜单的跳转 文件目录如下...

Embrace924的博客 3084

Flash芯片的VCC上电到可操作时间过长

Flash的VCC上电到操作时间(tVSL)通常有最大值限制,如果超过这个时间,核心风险是状态机不同步和指令锁存错误。比如芯片内部振荡器可能已经尝试启动又休眠了,但主控却在这之后才发送指令,导致完全 misinterpreted。Flash芯片的(从电源上电到可以正常进行读写操作的时间)如果过长,会产生一系列负面影响简单来说,这个时间过长意味着电源上升速度太慢,违反了芯片的要求。

qq_61918649的博客 723

EV1527、PT2262傻傻分不清?一文讲透常见315/433MHz遥控编码协议区别与选型

本文深度对比了EV1527、PT2262和SC5262三种常见的315/433MHz遥控编码协议,详细解析了它们的技术特点、成本效益和适用场景。EV1527作为低成本方案的首选,特别适合智能家居和简易安防设备;PT2262在稳定性和兼容性上表现优异;而SC5262则在安全性方面具有显著优势。文章还提供了实用的选型框架和工程建议,帮助开发者在不同应用场景中做出最优决策。

weixin_33640562的博客 352

react多级路由的嵌套使用及参数的传递

一级路由/home /about import React, { Component } from "react"; import { Route, Switch,Redirect } from "react-router-dom"; import Home from "./pages/Home"; import About from "./pages/About"; import MyNavLink from "./components/MyNavLink"; import Header fro..

u014496893的博客 1879

【ODX介绍】-5-用于Flash刷写的ODX-F文件概述

用于Flash刷写的ODX-F文件概述

「汽车电子助手」的博客 2531

25、react 中使用路由 router 详解

路由就是一个映射关系( key: value)。key 为路径, value 可能是 function 或者是 component。我们学习路由的时候会遇到两个经常用的单词router和route。区别是什么呢?router 是全局的路由器对象。route 是当前激活的路由对象。打个比方哈,我们自己家里上网需要路由器吧,router 就相当于家里的 路由器。route 就相当于路由器上面的网线插口或者是那个天线,不能没有 router 就是用 route。

“跟他人学,和自己比” 1371

Open Dynamics Engine(ODE)物理引擎教程(1)--下载与安装准备

引言 ODE是一个免费的工业级库,用于模拟关节式刚体动力学,例如地面车辆、腿部生物和虚拟现实环境中的移动对象。它具有快速、灵活、健壮和独立于平台的特点,具有先进的关节、摩擦接触和内置的碰撞检测功能。 项目主页:http://www.ode.org/ 线上手册:http://ode.org/wiki/index.php?title=Manual 本教程为博主亲自亲测过程的总结,转载请注明出处! ...

腿足机器人领域 2216

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

React路由 React-router-dom的使用

react的的插件库,专门做SPA应用 安装5版本的 npm install react-router-dom@5 NavLink 的使用 Switch的使用 1.通常情况下,path和component是一一对应的关系 2.Switch可以提高路由匹配的效率(单一匹配) 路由组件与一般组件 解决多级路径样式丢失的问题 路由的严格匹配和模糊匹配 嵌套路由 向路由组件中传递数据 1.params参数(常用) 2.传递search参数 3.传递state参数 push 和 replace

xal 1136

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

react路由|react-router-dom(react-router5)

一个路由其实就是一个映射关系。(k:v)key为路径,v为function或component。

weixin_57660777的博客 352

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

React路由鉴权

前言 上一篇文章中有同学提到路由鉴权,由于时间关系没有写,本文将针对这一特性对vue和react做专门说明,希望同学看了以后能够受益匪浅,对你的项目能够有所帮助,本文借鉴了很多大佬的文章篇幅也是比较长的。 背景 单独项目中是希望根据登录人来看下这个人是不是有权限进入当前页面。虽然服务端做了进行接口的权限,但是每一个路由加载的时候都要去请求这个接口太浪费了。有时候是通过SESSIONID来校验登陆权...

weixin_45189747的博客 2466

react router 路由守卫_React路由鉴权的实现方法

前言上一篇文章中有同学提到路由鉴权,由于时间关系没有写,本文将针对这一特性对 vue 和 react 做专门说明,希望同学看了以后能够受益匪浅,对你的项目能够有所帮助,本文借鉴了很多大佬的文章篇幅也是比较长的。背景单独项目中是希望根据登录人来看下这个人是不是有权限进入当前页面。虽然服务端做了进行接口的权限,但是每一个路由加载的时候都要去请求这个接口太浪费了。有时候是通过SESSIONID来校验登陆...

weixin_33657499的博客 2599

【React】路由

本文介绍了React中SPA应用和路由的基本概念,重点解析了react-router-dom的使用方法。SPA是单页应用,通过前端路由实现局部更新,数据通过ajax请求获取。文章对比了BrowserRouter和HashRouter的区别,详细说明了Link、Route、NavLink等组件的使用方法,并比较了v5和v6版本的差异。此外,还探讨了路由组件与普通组件的区别、多级路径样式丢失问题以及路由匹配规则的变化。V6版本简化了API,默认采用精确匹配,移除了Switch组件,改用Routes替代。

weixin_44899940的博客 805

React---路由的使用(二)

一、NavLink   NavLink可以实现路由链接的高亮,通过activeClassName指定样式名 <NavLink activeClassName="demo" className="list-group-item" to="/about">About</NavLink> <NavLink activeClassName="demo" classNam...

lelara的博客 146

第五章React路由

一般组件中没有this.props.history属性,路由组件中才会有。当路由都匹配不上的时候重定向到/about。

LQlove1的博客 330

react-router笔记总结

react-router 前端路由的基石_history: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>前端路由的基石_history</title> </head> <body> <a href="http://www.atguigu.com" onclick="return push('/test1

Afterwade的博客 592

React-router 全面总结和整理

一、SPA的理解 单页Web应用(Single page web application,SPA); 整个应用只有一个完整的页面; 点击页面中的链接(React路由技术)不会刷新页面,只会做页面的多局部更新; 数据都需要通过ajax请求获取,并在前端异步展现; 总结:单页面多组件; 二、路由基本概念 什么是路由? 一个路由就是一个映射关系(key:value) key为路径,value可能是function或者component 路由分类 后端路由: value是function,用来处理客

今天的我还菜嘛 936

react路由学习

文章目录一、路由的基本使用二、路由组件与一般组件三、NavLink与封装NavLink四、Switch的使用五、解决多级路径刷新页面样式丢失的问题六、路由的严格匹配与模糊匹配七、Redirect的使用八、嵌套路由九、向路由组件传递参数十、编程式路由导航十一、BrowserRouter与HashRouter的区别 一、路由的基本使用 1.明确好界面中的导航区、展示区 2.导航区的a标签改为Link标签 <Link to="/xxxxx">Demo</Link> 3.展示区写Rou

weixin_46351593的博客 160

手撸react路由

前端路由 后端路由 路由的原理 :history BOM react路由 官方插件库 脚手架默认是不会进行安装的 react-router-dom npm i react-router-dom tips:一个项目安装包依赖的时候要么用npm 要么用yarn 不能混着用 安装: 一般组件和路由组件的区别 常见的组件 使用路由组件 Link 属性to 属性replace NavLink 属性to 属性activaClassName 注册路由组件 switch Router

Daniel丶 420
上一篇: 牛客 剑指offer二维数组中的查找
下一篇: react-router实现重定向多种方式(补充中)
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值