【React】 react路由

这一篇文章的重点在于将React关于路由的问题都给搞清楚。
一个路由就是一个映射关系,key:value。key是路径,value 可能是function或者component。
安装react-router-dom包使用路由服务,我这里想要用的是6版本的包,因此后面加”@6"

npm install react-router-dom@6

首先要介绍的是HashRouter和BrowserRouter,这两个组件的作用在于提供一个路由环境,方便在后续React应用程序中使用路由服务。

一、HashRouter和BrowserRouter之间的区别

HashRouter和BrowserRouter之间的区别主要表现在两个方面,一个是表现形式,一个是工作原理。

1. URL表现形式

BrowserRouter的url没有#符号。例如:http://example.com/about
HashRouter的url中包含了一个#符号,该符号后面是hash部分,不会发送到服务器。 例如:http://example.com/#/about

2. 工作原理

对于HashRouter来说,它不需要在服务器中对相应的路由进行配置,它监听hashchange事件,根据hash的变化渲染对应的组件。
对于BrowserRouter来说,他使用Html5中的History api来实现路由。因为不是hash段所以会向服务器端发送请求,需要在服务器中进行相应的配置,均返回index.html网站即可。

跟这两个类似的还有一个MemoryRouter,这里暂不介绍。

上述内容是用来包裹react应用的,使React应用支持路由服务

二、NavLink、Link、Routes和Route

Routes是路由器组,Route必须要用它包裹才能用,Routes的作用是包括Route包裹路由,Route的作用是将组件放在所要定义的位置。

<Routes>
    <Route path="/home" element={<Home />} />
    <Route path="/about" element={<About />} />
    <Route path="/" element={<Navigate to="/home" />} />
</Routes>

NavLink与Link按钮之间的区别在于,如果NavLink被点击之后会增加一个active的类名,可以被设置相应的样式,而link没有。
Link与NavLink的作用就相当于是人告诉界面我要显示哪个组件,然后Route的作用是去找组件。

<div>
    <NavLink to="/about">About</NavLink>
    <NavLink to="/home">Home</NavLink>
</div>

在这里插入图片描述
上述内容如下图所示。
路由设置图

三、 useRoutes、路由表、Outlet

路由表
RouteObject
在这里插入图片描述
目前在使用的过程中我只使用了path、children、caseSensitive、element四个基本的配置项。
Index.tsx中定义路由表

import React from "react";
import About from "../components/About";
import Home from "../components/Home";
import News from "../components/News";
import Message from "../components/Message";
import { Navigate } from "react-router-dom";
 
const routes: any[] = [
  {
    path: "/about",
    element: <About />,
  },
  {
    path: "/home",
    element: <Home />,
    children: [
      {
        path: "news",
        element: <News />,
      },
      {
        path: "message",
        element: <Message />,
      },
    ],
  },
  {
    path: "/",
    element: <Navigate to="/about" />,
  },
];
export default routes;

app中引入路由表并使用

import React from "react";
import routes from "./router/index";
import { NavLink, useRoutes } from "react-router-dom";
 
function App() {
  const element = useRoutes(routes);
  return (
    <div className="App">
      <div>
        <NavLink to="/about">About</NavLink>
        <NavLink to="/home">Home</NavLink>
      </div>
      {element}
    </div>
  );
}
 
export default App;

子路由部分用标签占位,定义插入位置

import React from "react";
import { NavLink, Outlet } from "react-router-dom";
 
export default function Home() {
  return (
    <div>
      <h2>Home组件内容</h2>
      <div>
        <NavLink to="news">新闻</NavLink>
        <NavLink to="message">信息</NavLink>
      </div>
      <Outlet />
    </div>
  );
}

上述定义均没有涉及样式,样式是在组件里或者html部分自行定义的。

四、路由传参方式

路由传参方式有三种,

1. 一个是useParams接收参数,接收的是路径上的参数,例如:/index/id,接收的是这个id;

首先,是设置路由表的地方跟别的有点区别,因为它是接收路径上的参数。

//在path地方需要进行特殊定义
      {
        path: "message",
        element: <Message />,
        children: [
          {
            path: "detail/:id/:title/:content",
            element: <Detail />,
          },
        ],
      },

其次,传递方式。

import React, { useState } from "react";
import { Link, Outlet } from "react-router-dom";
 
export default function Message() {
  const [messages] = useState([
    { id: "001", title: "消息1", content: "锄禾日当午" },
    { id: "002", title: "消息2", content: "汗滴禾下土" },
    { id: "003", title: "消息3", content: "谁知盘中餐" },
    { id: "004", title: "消息4", content: "粒粒皆辛苦" },
  ]);
  return (
    <div>
      <ul>
        {messages.map((m) => {
          //   const url = "detail?id=" + m.id + "&title=" + m.title + "&content=" + m.content;
          return (
            <li key={m.id}>
              {/* 模版字符串传参数*/}
              <Link to={`/home/message/detail/${m.id}/${m.title}/${m.content}`}>
                {m.title}
              </Link>
            </li>
          );
        })}
      </ul>
      <hr />
      {/* 指定子组件所放置的位置 */}
      <Outlet />
    </div>
  );
}

接收参数,useParams

import React from "react";
import { useParams } from "react-router-dom";
export default function Detail() {
  const { id, title, content } = useParams();
  return (
    <div>
      <div>
        <p>id:{id}</p>
        <p>title:{title}</p>
        <p>content:{content}</p>
      </div>
    </div>
  );
}

useParams()这个方法只用来接收参数。
在这里插入图片描述

2. 第二种是接收url中传递的参数,使用useLocation,例如:/index?id=5,接收的是这个id;

//传递参数的方式
    <div>
      <ul>
        {messages.map((m) => {
          const url =
            "detail?id=" + m.id + "&title=" + m.title + "&content=" + m.content;
          return (
            <li key={m.id}>
              <Link to={url}>{m.title}</Link>
            </li>
          );
        })}
      </ul>
      <hr />
      {/* 指定子组件所放置的位置 */}
      <Outlet />
    </div>

//上面传递参数的方式也可以直接用模版字符串来传参
<Link to={`detail?id=${m.id}&title=${m.title}&content=${m.content}`} >

需要使用location对象来接收参数。

//接收参数的方式
import React from "react";
import { useLocation } from "react-router-dom";
export default function Detail() {
  const location = useLocation();
  const queryParams = new URLSearchParams(location.search);
  const [id, title, content] = [
    queryParams.get("id"),
    queryParams.get("title"),
    queryParams.get("content"),
  ];
  return (
    <div>
      <div>
        <p>id:{id}</p>
        <p>title:{title}</p>
        <p>content:{content}</p>
      </div>
    </div>
  );
}

下面是打印出来的location,可以看到下面接收的对象中有哪些数据。

3. 第三种是接收state传递的参数,使用useState.

传递参数

import React, { useState } from "react";
import { Link, Outlet } from "react-router-dom";
 
export default function Message() {
  const [messages] = useState([
    { id: "001", title: "消息1", content: "锄禾日当午" },
    { id: "002", title: "消息2", content: "汗滴禾下土" },
    { id: "003", title: "消息3", content: "谁知盘中餐" },
    { id: "004", title: "消息4", content: "粒粒皆辛苦" },
  ]);
  return (
    <div>
      <ul>
        {messages.map((m) => {
          //   const url = "detail?id=" + m.id + "&title=" + m.title + "&content=" + m.content;
          return (
            <li key={m.id}>
              {/* 使用state传参 */}
              <Link
                to="detail"
                state={{ id: m.id, title: m.title, content: m.content }}
              >
                {m.title}
              </Link>
            </li>
          );
        })}
      </ul>
      <hr />
      {/* 指定子组件所放置的位置 */}
      <Outlet />
    </div>
  );
}

接收参数,上面我们在location对象中看到了state,我们就是接收location对象中的state。

import React from "react";
import { useLocation, useParams } from "react-router-dom";
export default function Detail() {
  const location = useLocation();
  const { id, title, content } = location.state;
  console.log(useParams());
  return (
    <div>
      <div>
        <p>id:{id}</p>
        <p>title:{title}</p>
        <p>content:{content}</p>
      </div>
    </div>
  );
}

useMatch() api返回当前匹配结果。

  console.log(useMatch("/home/message/detail"));

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958575.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

隐私保护+性能优化,RyTuneX 让你的电脑更快更安全

RyTuneX 是一款专为 Windows 10 和 11 用户量身打造的系统优化工具&#xff0c;采用先进的 WinUI 3 框架开发&#xff0c;以其现代化的设计风格和强大的功能集合脱颖而出。这款工具不仅界面简洁美观&#xff0c;还提供了多样化的系统优化选项&#xff0c;旨在帮助用户最大化设备…

HTML新春烟花

系列文章 序号目录1HTML满屏跳动的爱心&#xff08;可写字&#xff09;2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心&#xff08;简易版&#xff09;7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心&#xff08;双心版&#xff09;1…

(回溯分割)leetcode93 复原IP地址

#include<iostream> #include<vector> #include<string> #include<algorithm> using namespace std; //卡尔的图不是按照程序执行过程而是直接画程序会执行的过程 // 实际执行是&#xff1a;n个字符&#xff0c;递推n1后&#xff08;叶子节点&#xff…

关于ARM和汇编语言

一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段&#xff1a;控制器器通过地址总线向存储器发送想要获取的指令的地址编号&#xff0c;存储器将指定的指令发送给处理器 译码阶段&#xff1a;控制器对指令进行分…

个人学习 - 什么是Vim?

观我往旧&#xff0c;同我仰春 - 2025.1.10 声明 仅作为个人学习使用&#xff0c;仅供参考 本文所有解释参考笔者个人理解&#xff0c;最终目的是服务于自我学习&#xff0c; 如果你需要了解官方更规范的解释&#xff0c;请自行查阅 Vim 是什么 Vim 是一个强大的 文本编辑器…

python学习笔记2-简单数据类型

不同类型的变量可以进⾏的运算是不同的&#xff0c;所以必须理解变量的类型&#xff0c;python中数据类型可以分为&#xff1a; Number&#xff08;数值&#xff09; 整型&#xff08;int&#xff09; python3中只有int⼀种&#xff0c;可以表⽰整数&#xff0c;例如&#xf…

ChromeOS 132 版本更新

ChromeOS 132 版本更新 1. 企业定制化 Chrome Web Store 管理员现在可以使用新设置定制 Chrome Web Store 以适应他们管理的用户&#xff0c;包括以下功能&#xff1a; 添加公司标志添加首页横幅和自定义公告策划扩展集合实施基于类别的控制 这些设置可以通过管理员控制台进…

Python的进程和线程

ref 接受几个设定: 进程是一家almost密不透风的公司,缅甸KK园区 线程里面工作的…人 进程**[园区]**内公共资源对于进程来说,可以共享. 别的园区[进程],一般不能和自己的园区共享人员资源,除非… 好的,现在再接受设定: 单个CPU在任一时刻只能执行单个线程&#xff0c;只有…

03垃圾回收篇(D4_彻底理解GC)

目录 一、浅析大促备战过程中出现的 fullGc&#xff0c;我们能做什么&#xff1f; 1. 什么是 JVM 的 GC? 2. 写代码的时候能做什么&#xff1f; 3. 测试能做啥 4. 知识小结 二、MinorGC、MajorGC、FullGC垃圾回收介绍 1. MinorGC &#xff08;新生代垃圾回收&#xff09…

软件测试 —— jmeter(2)

软件测试 —— jmeter&#xff08;2&#xff09; HTTP默认请求头&#xff08;元件&#xff09;元件作用域和取样器作用域HTTP Cookie管理器同步定时器jmeter插件梯度压测线程组&#xff08;Stepping Thread Group&#xff09;参数解析总结 Response Times over TimeActive Thre…

分子动力学模拟里的术语:leap-frog蛙跳算法和‌Velocity-Verlet算法

分子动力学模拟&#xff08;Molecular Dynamics Simulation&#xff0c;简称MD&#xff09;是一种基于经典力学原理的计算物理方法&#xff0c;用于模拟原子和分子在给定时间内的运动和相互作用‌。以下是关于分子动力学模拟的一些核心术语和概念&#xff1a; ‌定义系统‌&am…

在 Windows 11 中为 SMB 3.x 文件共享协议提供 RDMA 支持

注&#xff1a;机翻&#xff0c;未校。 Enable SMB Direct in Windows 11 在 Windows 11 中启用 SMB Direct Provides RDMA support for the SMB 3.x file sharing protocol 为 SMB 3.x 文件共享协议提供 RDMA 支持 Vigneshwaran Vijayakumar November 3, 2024 Last Updat…

zabbix6.0安装及常用监控配置

文章目录 部署zabbix-serverzabbix监控节点部署解决zabbix中文乱码创建主机组创建模版配置主机与模版关联 监控boot分区监控网卡流量出网卡流量监控进入和出的总流量监控内存监控服务器端口用户自定应监控key值 (监控mysql查询数量)zabbix触发器监控cpu监控入网卡流量 邮件告警…

如何将使用unsloth微调的模型部署到ollama?

目录 一、将模型保存为gguf格式 二、下载llama.cpp 三、生成 llama-quantize 可执行文件 四、使用llama-quantize 五、训练模型 六、将模型部署到ollama 一、将模型保存为gguf格式 在你的训练代码 trainer.train() 之后添加&#xff1a; model.save_pretrained_gguf(&q…

【Hadoop面试题2025】

文章目录 简单题故障及相应的处理方法中等难度高难度小文件小文件的产生小文件问题的影响小文件治理方案推荐方案 冷文件冷文件的产生冷文件问题的影响冷文件治理方案推荐方案 简单题 一、基础概念类 什么是Hadoop&#xff1f; 答案&#xff1a;Hadoop是一个开源的分布式计算框…

2025.1.21——六、BUU XSS COURSE 1 XSS漏洞|XSS平台搭建

题目来源&#xff1a;buuctf BUU XSS COURSE 1 目录 一、打开靶机&#xff0c;整理信息 二、解题思路 step 1&#xff1a;输入框尝试一下 step 2&#xff1a;开始xss注入 step 3&#xff1a;搭建平台 step 4&#xff1a;利用管理员cookie访问地址 三、小结 二编&#…

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

IPhone16 Plus 设备详情

目录 产品宣传图内部图——前内部图——后设备详细信息 产品宣传图 内部图——前 内部图——后 设备详细信息 信息收集于HubWeb.cn

PyTorch入门 - 为什么选择PyTorch?

PyTorch入门 - 为什么选择PyTorch? Entry to PyTorch - Why PyTorch? by JacksonML $ pip install pytorch安装完毕后&#xff0c;可以使用以下命令&#xff0c;导入第三方库。 $ import pytorch

Jmeter 动态参数压力测试时间段预定接口

&#x1f3af; 本文档详细介绍了如何使用Apache JMeter进行压力测试&#xff0c;以评估预定接口在高并发场景下的性能表现。通过创建线程组模拟不同数量的用户并发请求&#xff0c;利用CSV文件动态配置时间段ID和用户token&#xff0c;确保了测试数据的真实性和有效性。文档中还…