react基础05--react-router 路由

2023-10-29

1 介绍

react基础04–redux 管理数据 中介绍了redux 管理数据的方法,并配以实际案例。本节继上文继续介绍 react-router,实现单页面内部跳转功能。

2 方法&案例

安装路由

npm i react-router-dom --save

react-router 路由的基本使用

通过对router的基本使用,可以实现单击或者在url输入模块名称就返回对应模块的信息。

vim index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>React App 3-1</title>
  </head>
  <body>
    <div id="root"></div>
  </body>
</html>

vim index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

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

vim App.js

import React, { Component } from 'react'
import Header from './Header'
import {BrowserRouter, Route} from 'react-router-dom'
import Home from './Home'
import News from './News'
import Guoji from './Guoji'

export class App extends Component {
    constructor(){
        super()
    }
    render(){
        return (
            <BrowserRouter>
                <Header></Header>
                <hr/>
                <Route path="/home" component={<Home />} />
                <Route path="/news" component={<News />} />
                <Route path="/guoji" component={<Guoji />} />
            </BrowserRouter>
        )
    }
}
export default App

vim Header.js

import React, { Component } from 'react'
import { Link } from 'react-router-dom'


export class Header extends Component {
    render(){
        return (
        <div style={{display: 'flex', flexDirection: 'row'}}>
            <Link to="/home">首页</Link>
            <Link to="/news">&nbsp;&nbsp;新闻</Link>
            <div>&nbsp;&nbsp;国际</div>
        </div>
        )
    }
}
export default Header

vim Home.js

import React, { Component } from 'react'

export class Home extends Component {  
    render() {
        return (
            <div>
                这是首页
            </div>
        )
    }
}
export default Home

vim News.js

import React, { Component } from 'react'

export class News extends Component {
    render() {
        return (
            <div>
                这是新闻页
            </div>
        )
    }
}
export default News

vim Guoji.js

import React, { Component } from 'react'

export class Guoji extends Component {
    render() {
        return (
            <div>
                这是国际页
            </div>
        )
    }
}
export default Guoji

结果:
点击首页|新闻,就会输出首页或者新闻模块的信息,在url 输入home|news|guoji 也会输出对应模块的信息。
在这里插入图片描述

路由传参

实际项目中,我们很多时候需要通过url 的参数来显示不同的页面,因此我们需要在 route 中可以接收参数,而且需要通过具体组件的 props 来获取参数的值。
vim app.js

import React, { Component } from 'react'
import Header from './Header'
import {BrowserRouter, Route, Routes} from 'react-router-dom'
import Home from './Home'
import News from './News'
import Guoji from "./Guoji";

export class App extends Component {
    render(){
        return (
            <BrowserRouter>
                <Header></Header>
                <hr/>
                <Route path="/home" component={Home} />
                <Route path="/news/:id/:title"  component={News} />
                <Route path="/guoji" component={Guoji} />
                <Route exact path="/" component={Home} />
            </BrowserRouter>
        )
    }
}
export default App

path="/news/:id/:title" 是其可以接收 id 和 tittle 参数

vim Header.js

import React, { Component } from 'react'
import { Link } from 'react-router-dom'


export class Header extends Component {
    render(){
        return (
        <div style={{display: 'flex', flexDirection: 'row'}}>
            <Link to="/home">首页</Link>
            <Link to="/news/1/news1">  &nbsp;新闻</Link>
            <div>&nbsp;国际 &nbsp;</div>
        </div>
        )
    }
}
export default Header

to="/news/1/news1"> ,直接给其内置1/news 参数

vim News.js

import React, { Component } from 'react'

export class News extends Component {
    render() {
        console.log(this.props)
        const {id, title} = this.props.match.params
        return (
            <div>
                这是新闻页 -- {id},{title}
            </div>
        )
    }
}
export default News

通过 this.props.match.params 获取参数,并将其显示在主页上

结果:
点击 新闻, 其 url 为 http://localhost:3000/news/1/news1,且成功地将该参数显示在组件News 的页面上。
在这里插入图片描述

Switch 路由匹配

默认情况下,如果我们使用多个Route,且最后一个path="/", 从上到下匹配路由,如果匹配到News后,也会匹配到 Home,导致显示的内容过多。
此时我们可以通过 Switch 来解决,当匹配到一个后及停止匹配。

vim App.js

import React, { Component } from 'react'
import Header from './Header'
import {BrowserRouter, Route, Switch} from 'react-router-dom'
import Home from './Home'
import News from './News'
import Guoji from "./Guoji";

export class App extends Component {
    render(){
        return (
            <BrowserRouter>
                <Header></Header>
                <hr/>
                <Switch>
                    <Route path="/news/:id/:title"  component={News} />
                    <Route path="/guoji" component={Guoji} />
                    <Route path="/" component={Home} />
                </Switch>
            </BrowserRouter>
        )
    }
}
export default App

结果:
使用Switch 后,当url不输入任何参数的时候,其默认会匹配到 “/”
在这里插入图片描述

嵌套路由

实际应用中我们很多时候需要多曾菜单,即需要多层路由,此时我们就需要在子组件中再通过Switch 新增一层路由。
vim App.js

import React, { Component } from 'react'
import Header from './Header'
import {BrowserRouter, Route, Switch} from 'react-router-dom'
import Home from './Home'
import News from './News'
import Guoji from "./Guoji";

export class App extends Component {
    render(){
        return (
            <BrowserRouter>
                <Header></Header>
                <hr/>
                <Switch>
                    <Route path="/news"  component={News} />
                    <Route path="/guoji"  component={Guoji} />
                    <Route path="/" component={Home} />
                </Switch>
            </BrowserRouter>
        )
    }
}
export default App

vim Header.js

import React, { Component } from 'react'
import { Link } from 'react-router-dom'

export class Header extends Component {
    render(){
        return (
        <div style={{display: 'flex', flexDirection: 'row'}}>
            <Link to="/home">首页</Link> &nbsp;
            <Link to="/news">新闻</Link> &nbsp;
            <Link to="/guoji">国际</Link>
        </div>
        )
    }
}
export default Header

vim News.js

import React, { Component } from 'react'
import {Link, Route, Switch} from "react-router-dom";
import Sport from "./Sport";
import Shehui from "./Shehui";

export class News extends Component {
    render() {
        return (
            <div>
                <Link to="/news/sport">体育</Link>&nbsp;
                <Link to="/news/shehui">社会</Link>
                {/*二级路由|嵌套路由*/}
                <Switch>
                    <Route path="/news/sport" component={Sport} />
                    <Route path="/news/shehui" component={Shehui} />
                </Switch>
            </div>
        )
    }
}
export default News

vim Sport.js

import React, { Component } from 'react'

export class Sport extends Component {
    render() {
        return (
            <div>
                这是体育页
            </div>
        )
    }
}
export default Sport

同理社会页
结果:
点击新闻后,再点击子栏目,可以对应显示体育、社会等内容。
在这里插入图片描述

3 注意事项

  1. 最新版本react-router-doc 有elament属性,但是没有component 属性; 使用的时候需要将Route 放在 Routes 中。其props 也有很大的差异,因此可以通过 npm install react-router-dom@5.2.0 来指定版本。

  2. 如果需要用老版本的 react, 那么可以通过 npm install -g create-react-app@^3.4.1 来安装

  3. react route 需要注意格式

    tiny-warning.esm.js:11 Warning: You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored
    
     render(){
         return (
             <BrowserRouter>
                 <Switch>
                     <Route path="/list/:id" component={GoodsList} > </Route>
                     <Route exact path="/" component={Nav01} />
                 </Switch>
             </BrowserRouter>
         )
     }
    

    在这里插入图片描述
    更改后

     render(){
         return (
             <BrowserRouter>
                 <Switch>
                     <Route path="/list/:id" component={GoodsList} />
                     <Route exact path="/" component={Nav01} />
                 </Switch>
             </BrowserRouter>
         )
     }
    

    在这里插入图片描述

  4. 如果使用 UNSAFE_componentWillMount() 的话, 那么需要在 index.js 中去掉</React.StrictMode>, 否则会warning.

4 说明

软件版本:
node 16.13.1
create-react-app 5.0.0
react-router-dom@5.2.0
参考文档:
React基础入门+综合案例
react 官网
React基础入门教程
withRouter’ is not exported from ‘react-router-dom’

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react基础05--react-router 路由 的相关文章

  • 如何在react-select v2中创建optgroup?

    我想在我的反应选择列表中包含 optgroups 但它似乎没有记录在任何地方 我有以下结构 是从评论中提取的https github com JedWatson react select issues 59 https github com
  • 优化数据可视化 Web 应用程序的性能

    我正在重写 3 年前编写的数据可视化网络工具 从那时起 浏览器的 JavaScript 引擎变得更快 所以我正在考虑将部分工作从服务器转移到客户端 在页面上 数据在表格和地图 或图表 中可视化 它使用相同的数据 但以不同的方式 因此准备显示
  • 在 Angular 单元测试中应该如何处理运行块?

    我的理解是 当您在 Angular 单元测试中加载模块时 run块被调用 我认为如果你正在测试一个组件 你不会想同时测试run块 因为unit测试应该只是测试一个unit 真的吗 如果是的话有什么办法可以防止run阻止运行 我的研究让我认为
  • 向 JS 计算器添加键盘支持时出现的问题

    我想为我的计算器添加键盘支持 当我用键盘按下操作 即 或 时 js将其视为数字 而不是操作 例如 当我通过点击计算 10 11 时 我将得到 21 作为结果 当我通过键盘输入时 我会得到 10 为什么会发生这种情况 是否可以改变它 div
  • jQuery - 提高处理 XML 时的选择器性能

    我正在处理一个 XML 文件 当使用 XPath 样式选择器选择节点时 该文件的性能非常慢 这是运行特别慢的部分代码 for i 0 i
  • 是否可以将自定义 HTML 添加到传单图层组和图层控件

    有什么方法可以将自定义 HTML 注入图层组和图层控件中吗 在我们的应用程序中 我们实现了滑块 输入 范围 来调整不透明度设置 并且很明显 在其控制容器内部的基础层上使用专用滑块是有意义的 没有选项或参数可以修改此控件 理想情况下 我们希望
  • Disqus 评论数始终为 0 条评论

    我想我已经按照通用代码的说明设置了 Disqus 问题是它总是说某个帖子有 0 条评论 拿这个帖子来说 http tx0rx0 com retropie and the raspberry pi http tx0rx0 com retrop
  • 禁用整个站点的 IE8 加速器

    是的 我知道有类似的问题 https stackoverflow com questions 499565 is it possible to disable ie8 accelerators on my website在 SO 上 但它已
  • 如何删除从 javascript var 转义的反斜杠?

    我有这个变量 var x div class Which is div class 但是我需要 div class abcdef 我怎样才能 unes cape 这个变量来删除所有转义字符 您可以通过正则表达式将反斜杠后跟引号替换为仅引号
  • 如何在启用导航栏的情况下打开新的浏览器窗口?

    我有这个JS方法 function OpenLink strDestination var features left 10 top 10 location 0 menubar 0 resizable 0 scrollbars 1 stat
  • Famo.us 滚动视图高度

    我正在尝试使用著名的顺序布局在滚动视图下方添加图像 但滚动视图的高度有问题 这就是我创建滚动视图的方式 var scrollview new Scrollview direction Utility Direction X options
  • 将数组中的所有元素相乘

    我在这里找不到我真正想要的例子 我想将所有数组元素相乘 因此如果数组包含 1 2 3 总和将为 123 6 到目前为止 我已经得到了这段代码 但它返回未定义 function multiply array var sum 1 for var
  • 添加选项以选择框而不用 Internet Explorer 关闭该框?

    我正在尝试构建一个包含多个下拉选择框的网页 这些下拉选择框在首次打开时异步加载其选项 这在 Firefox 下工作得很好 但在 Internet Explorer 下则不然 下面是我想要实现的目标的一个小例子 基本上 有一个选择框 ID 为
  • 很奇怪!调用 window.location 或 location.replace 会重定向到该页面,然后再次返回!

    我处于调试模式 因此我可以看到正在访问哪个页面 当我打电话时window location or window location replace 它会转到该页面 然后返回原始页面 怎么会这样 解决方案是添加 window location
  • 当表格在 IE 中获得焦点时,表格滚动条会向上跳跃

    问题 我有一个table有包装的div with overflow y auto 一旦table获得焦点 滚动条向上跳 我怎样才能防止这种情况发生 我经历过这种行为IE9 不在 Chrome 中 请注意 我已添加tabindex到桌子上 以
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 使用 Socket.IO 时如何访问会话标识符?

    我有一个聊天 我需要管理独特的连接 我四处搜寻 但我找到的解决方案似乎都已被弃用 那么 如何使用 Socket IO 获取套接字的会话 ID 我在用着Node js http en wikipedia org wiki Node js Ex
  • 在多个数组中搜索字符串,然后设置 var - jQuery

    我正在寻找基于字符串存在于哪个数组中设置一个变量 例如 var primary red blue yellow var secondary orange purple green 然后检查 purple 并返回它在 secondary 数组
  • window.open 使用 css 样式

    我想设计我的 window open 目前 我的网页上有一些项目由于解析了某个类而打开 然后在新窗口中打开指定的文本 我想更改字体大小 字体和填充等 这是我的 JavaScript 代码
  • 在 Firefox 中使用 Javascript 检测键盘布局

    有没有办法在 Firefox 中检测客户端的键盘布局 我知道 Chrome 的答案是肯定的 请参阅https developer mozilla org en US docs Web API Navigator keyboard https

随机推荐

  • Git中的Sign Off功能是什么?

    Git中的Sign Off功能有什么意义 git commit signoff 我什么时候应该使用它 如果有的话 1楼 签名是提交消息末尾的一行 用于证明谁是提交的作者 其主要目的是改善对谁做了什么的追踪 尤其是补丁 提交示例 Add te
  • Ubuntu 15 安装Zsh与oh-my-zsh

    一 前言 Zsh和bash一样 是一种Unix shell 但大多数Linux发行版本都默认使用bash shell 但Zsh有强大的自动补全参数 文件名 等功能和强大的自定义配置功能 oh my zsh是基于zsh的功能做了一个扩展 方便
  • 数据结构--顺序表,栈的实现

    顺序表 顺序表是在计算机内存中以数组的形式保存的线性表 线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素 使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中 即通过数据元素物理存储的相邻关系来反映数据元素
  • vmware创建的虚拟机无法连接外网

    在我本机中使用vmware创建虚拟机后 安装 docker 时使用wget 命令下载docker的安装文件 报错找不到资源 然后通过ping www baidu com 发现也ping不通 经过一番折腾可以访问外网了 将步骤记录下来 1 设
  • vue-cli2 ,区分开发环境,测试环境,生成环境的方法

    项目背景 为了适应vue cli2环境搭建需求 需要动态配置开发 测试 生产三种对应域名及其及打包命令 使用cross env可以让配置环境更加清晰明了还好管理 1 安装 cross env npm install save dev cro
  • arccotx图像在matlab,反三角函数图像与性质是什么?

    01 反三角函数是反正弦arcsinx 反余弦arccosx 反正切arctanx 反余切arccotx 反正割arcsecx 反余割arccscx这些函数的统称 各自表示其反正弦 反余弦 反正切 反余切 反正割 反余割为x的角 三角函数的
  • 2021第十四届全国大学生信息安全竞赛WP(CISCN)-- pwn部分

    CISCN 2021 WP 概述 ciscn 2021 lonelywolf ciscn 2021 pwny 第一种利用方式 第二种利用方式 ciscn 2021 silverwolf ciscn 2021 game 总结 概述 作为学习不
  • PeopleSoft PeopleTools Meta-Tables

    This is an attempt to list PeopleSoft meta tables along with some kind of description for every table The list will be b
  • 手把手教你使用vue2搭建微前端micro-app

    简述 本文主要讲述新手小白怎么搭建micro app 几乎是每一步都有截图说明 上手应该很简单 研究背景 这段时间在网上找了很多有关微前端相关的知识 起初本来是想着先搭建一个single spa 但是奈何网上能找到的内容都是千篇一律 我也是
  • 时钟芯片DS1302的原理及使用

    一 描述 DS1302时钟芯片是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 它可以对年 月 日 周 时 分 秒进行计时 且具有闰年补偿等多种功能 DS1302芯片包含一个用于存储实时时钟 日历的 31 字节的静态
  • Installing with get-pip.py

    本文转载至 https pip readthedocs io en stable installing 由于 Mac OS X 下默认没有安装 pip 可以使用如上的脚本来安装 pip 安装方法很简单 1 下载 get pip py htt
  • libtorch编译C++版本

    libtorch编译C 版本 一 下载pytorch源码 git clone https github com pytorch pytorch git cd pytorch git submodule sync git submodule
  • 如何配置Kubernetes仪表板dashboard支持http方式并使用ingress-nginx代理访问实践

    公众号关注 WeiyiGeek 设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 本章目录 配置 Kubernetes dashboard 以支持 http 方式访问 原文地址 https blog weiyigeek
  • centos6、centos7 脚本管理rsync服务状态

    1 环境准备 centos6 虚拟机 centos7 虚拟机 2 centos6 编写脚本 分析脚本管理的逻辑 centos6中管理 服务的脚本都是在 etc init d 目录下的 我们要在此目录下创建一个管理的脚本 centos系统是通
  • kafka配置之service.properties文件

    Server Basics 唯一标识一个broker broker id 1 Socket Server Settings 绑定服务监听的地址和端口 要填写hostname i 出来的地址 否则可能会绑定到127 0 0 1 produce
  • SQL-labs的第32关——union联合查询攻击 宽字节注入(Get)

    绕过向危险字符添加斜杠的自定义筛选器 注意只要出现危险字符就会自动添加斜杆 这里的危险字符只有单引号 所以只要写了单引号 就要干扰斜杠 1 判断闭合方式 输入语句 id 1 返回页面如下 按理来说 它这次是无法正常返回内容的 但是它正常返回
  • 全面解析Web3社交:深层次的链上社交将成为可能

    Web3是什么 Web3是一个没有既定定义的总括性术语 这个词包含了由社区和用户所有权驱动的去中心化的想法和愿景 Him Gajria写的一篇关于Web3 0的文章说得很好 Web1是只读的 网络托管内容 人们可以消费内容 但不能分享 We
  • matlab高代求商与余式,matlab求商取余remmod区别

    当除数和被除数同为正时 gt gt rem 10 91 ans 10 gt gt mod 10 91 ans 10 当除数和被除数同为负时 gt gt rem 10 91 ans 10 gt gt mod 10 91 ans 10 当除数和
  • 数字一阶低通滤波器立体解析

    一阶惯性环节 一个独立储能元件和一个耗能元件的组合 就可以构成一个惯性环节 下图就是一个常见的电路 一阶滤波电路 也可以叫一阶惯性环节 为什么叫一阶惯性环节呢 是因为当输入信号发生突变的时候 输出信号不能突变 只能按照指数规律逐渐变化 是不
  • react基础05--react-router 路由

    react基础05 react router 路由 1 介绍 2 方法 案例 react router 路由的基本使用 路由传参 Switch 路由匹配 嵌套路由 3 注意事项 4 说明 1 介绍 react基础04 redux 管理数据