ReactRouterDom-v5v6用法与异同

news2024/11/17 9:47:12

本文作者系360奇舞团前端开发工程师

简介:

React Router Dom是React.js中用于实现路由功能的常用库。在React应用中,路由可以帮助我们管理页面之间的导航和状态,并实现动态加载组件。本文将深入探讨React Router Dom的两个主要版本:V5和V6,并介绍它们的用法和异同点。

v5用法

React Router Dom的V5版本是在React Router的基础上构建的。它是一个稳定且广泛使用的版本,为React应用提供了强大的路由功能。以下是V5版本的用法示例:

安装React Router Dom:

npm install react-router-dom@5
yarn add react-router-dom@5

导入所需组件:

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

在应用中定义路由:

<Router>
  <nav>
    <ul>
      <li>
        <Link to="/">首页</Link>
      </li>
      <li>
        <Link to="/about">关于</Link>
      </li>
    </ul>
  </nav>

  <Route path="/" exact component={Home} />
  <Route path="/about" component={About} />
  </Router>

在组件中使用路由参数:

import { useParams } from 'react-router-dom';

function User() {
  let { id } = useParams();
  return <h2>用户ID: {id}</h2>;
}
  • V5版本的React Router Dom提供了许多强大的功能,如嵌套路由、路由参数、重定向等。但在V6版本中,它们的用法可能有所不同。

v6用法

React Router Dom的V6版本是一个全新的重写版本,旨在提供更简洁和直观的API。以下是V6版本的用法示例:

安装React Router Dom V6:

npm install react-router-dom@next
yarn add react-router-dom@next

导入所需组件:

import { BrowserRouter as Router, Route, Link, Routes, Outlet } from 'react-router-dom';

在应用中定义路由:

<Router>
  <nav>
    <ul>
      <li>
        <Link to="/">首页</Link>
      </li>
      <li>
        <Link to="/about">关于</Link>
      </li>
    </ul>
  </nav>

  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/about" element={<About />} />
  </Routes>
</Router>

在组件中使用路由参数:

import { useParams } from 'react-router-dom';

function User() {
  let { id } = useParams();
  return <h2>用户ID: {id}</h2>;
}
  • V6版本的React Router Dom引入了一些新的概念,如 RoutesOutletRoutes 用于定义路由集合,而 Outlet 用于在父路由组件

BrowserRouter 与HashRouter

BrowserRouter 和 HashRouter 是 React Router Dom 中两种常用的路由器组件,它们用于在React应用中处理路由。

BrowserRouter:

BrowserRouter使用HTML5的 History API 来实现路由功能。它通过使用history.pushState()history.replaceState()方法来修改浏览器的URL,而不会引起页面的重新加载。BrowserRouter使用基于浏览器的URL路径来匹配和渲染对应的组件。 使用BrowserRouter时,需要将所有的路由规则放置在服务端的路由配置上,以确保在刷新或直接访问某个URL时能够正确加载对应的组件。

HashRouter:

HashRouter使用URL的哈希部分(#)来实现路由功能。它在URL中添加了一个哈希路由器,并通过监听window对象的hashchange事件来响应URL的变化。当URL的哈希部分发生改变时,HashRouter会匹配对应的路由规则并渲染相应的组件。 相对于BrowserRouter,HashRouter具有更广泛的兼容性,因为哈希部分的变化不会触发浏览器向服务器发起请求,而是在客户端进行处理。这对于一些需要部署在静态服务器上的应用程序非常有用。

import { BrowserRouter as Router, Route } from 'react-router-dom';
import { HashRouter as Router, Route } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Route path="/" component={Home} />
      <Route path="/about" component={About} />
    </Router>
  );
}
  • 需要注意的是,在使用HashRouter时,URL的哈希部分会被添加到应用的根路径之后,例如:http://example.com/#/about。这种方式可以让应用正确地响应URL的变化并显示对应的组件。

  • 总结:BrowserRouter和HashRouter是React Router Dom中两种常用的路由器组件。BrowserRouter使用HTML5的History API实现路由功能,而HashRouter使用URL的哈希部分实现路由功能。选择使用哪种路由器取决于应用的部署环境和兼容性需求。如果应用部署在一个支持HTML5 History API的服务器上,可以使用BrowserRouter;如果需要更广泛的兼容性,或者应用是一个纯静态网站,可以使用HashRouter。

Router中的重要配置

BrowserRouter与homepage

在React应用的package.json文件中,可以通过设置"homepage"参数来指定应用的基本URL路径。这个基本URL路径会影响React Router中使用的路由匹配规则和导航链接的生成。 当设置了"homepage"参数后,React Router的路由匹配规则和导航链接会考虑到该基本URL路径。它们会自动添加基本URL路径作为前缀,以确保路由的正确匹配和导航链接的生成。 例如,假设"homepage"参数设置为"/my-app",以下是使用React Router时的一些示例:

BrowserRouter:

import { BrowserRouter as Router, Route } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Route path="/" component={Home} /> {/* 匹配的路径为:/my-app/ */}
      <Route path="/about" component={About} /> {/* 匹配的路径为:/my-app/about */}
    </Router>
  );
}

在BrowserRouter中,设置了"homepage"参数后,路由匹配规则中的路径会自动添加基本URL路径作为前缀。

Link组件:

import { Link } from 'react-router-dom';

function Navigation() {
  return (
    <nav>
      <ul>
        <li>
          <Link to="/">首页</Link> {/* 生成的链接为:/my-app/ */}
        </li>
        <li>
          <Link to="/about">关于</Link> {/* 生成的链接为:/my-app/about */}
        </li>
      </ul>
    </nav>
  );
}
  • 在Link组件中,设置了"homepage"参数后,生成的导航链接会自动添加基本URL路径作为前缀。

  • 总结:设置package.json中的"homepage"参数可以指定React应用的基本URL路径。这个基本URL路径会影响React Router中的路由匹配规则和导航链接的生成,确保它们考虑到基本URL路径作为前缀。这在部署React应用到不同的路径下时非常有用,可以保证路由的正确匹配和导航链接的生成。

HashRouter与homepage

在React Router中,HashRouter不受package.json中的"homepage"参数的影响。设置"homepage"参数只会影响BrowserRouter的行为,不会直接影响HashRouter。 HashRouter使用URL的哈希部分(#)来实现路由功能,不依赖于基本URL路径。无论是否设置了"homepage"参数,HashRouter始终使用相对于根目录的哈希部分来匹配路由规则和生成导航链接。 例如,假设"homepage"参数设置为"/my-app",以下是使用HashRouter时的示例:

import { HashRouter as Router, Route } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Route path="/" component={Home} /> {/* 匹配的路径为:/#/ */}
      <Route path="/about" component={About} /> {/* 匹配的路径为:/#/about */}
    </Router>
  );
}

在HashRouter中,无论"homepage"参数设置为什么,路由的匹配规则和生成的导航链接仍然会使用/#//#/about这样的哈希部分路径。

  • 总结: HashRouter不受package.json中的"homepage"参数的影响。无论是否设置了"homepage"参数,HashRouter始终使用相对于根目录的哈希部分来匹配路由规则和生成导航链接。"homepage"参数只会影响BrowserRouter的行为。

其他参数

  1. basename: 可以通过在Router组件中设置basename属性来使用basename参数,如下所示:

import { BrowserRouter as Router, Route } from 'react-router-dom';

function App() {
  return (
    <Router basename="/my-app">
      <Route path="/" component={Home} />
      <Route path="/about" component={About} />
    </Router>
  );
}
  1. path: 在Route组件中使用path属性来定义路由规则的路径,如下所示:

import { BrowserRouter as Router, Route } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Route path="/" exact component={Home} />
      <Route path="/about" component={About} />
    </Router>
  );
}
  1. exact: 通过设置exact属性为true,确保只有当URL路径与path参数完全匹配时才进行渲染,如下所示:

import { BrowserRouter as Router, Route } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Route exact path="/" component={Home} />
      <Route exact path="/about" component={About} />
    </Router>
  );
}
  1. strict: 设置strict属性为true,以在末尾带有斜杠的URL路径上进行匹配,如下所示:

import { BrowserRouter as Router, Route } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Route strict path="/" component={Home} />
      <Route strict path="/about/" component={About} />
    </Router>
  );
}

以上示例展示了如何使用这些参数来影响路径的生成和匹配。根据具体需求,可以在相应的组件中设置这些参数来实现所需的路由配置。

引用

  • https://reactrouter.com/en/main/router-components/browser-router

  • https://www.npmjs.com/package/react-router-dom

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

e934f70bb62755e0b0a6565a65097a13.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​一文学会iOS画中画浮窗

本文字数&#xff1a;11934字 预计阅读时间&#xff1a;40分钟 背景 之前有看到有人用画中画实现时分秒的计时&#xff0c;顺手收藏了&#xff0c;一直没来及看。最近使用《每日英语听力》&#xff0c;突然发现它用画中画实现了听力语句的显示&#xff0c;顿时来了兴趣&#xf…

超线程技术

超线程&#xff08;HT, Hyper-Threading&#xff09;是英特尔研发的一种技术&#xff0c;于2002年发布。超线程技术原先只应用于Xeon 处理器中&#xff0c;当时称为“Super-Threading”。之后陆续应用在Pentium 4 HT中。早期代号为Jackson。 [1] 通过此技术&#xff0c;英特尔实…

Golang每日一练(leetDay0077) 存在重复元素、天际线问题

目录 217. 存在重复元素 Contains Duplicate &#x1f31f; 218. 天际线问题 The Skyline Problem &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 …

PyTorch-torchvision

1. 以Torchvision中的CIFAR10为例 dataset.py Ps&#xff1a;如果是从其他地方下载的gz文件&#xff0c;直接建立一个dataset文件夹然后将gz文件放进去&#xff0c;再运行。 import torchvisiontrain_set torchvision.datasets.CIFAR10(root"./dataset", trainTr…

SpringCloud Alibaba Nacos

SpringCloud Alibaba Nacos Nacos 基础 1 官网 1.1 https://github.com/alibaba/Nacos 2 Nacos 是什么&#xff1f; 2.1 一句话: Nacos 就是注册中心[替代Eureka]配置中心[替代Config] 2.2 Nacos&#xff1a;Dynamic Naming and Configuration Service 2.3 Nacos&#xff…

数据结构---二叉树(C语言)

二叉树 1. 二叉树1.1 二叉树的遍历1.1.1二叉树前中后序遍历&#xff08;递归版&#xff09;1.1.2 层序遍历 1.2 二叉树的其他相关接口1.2.1 求二叉树的结点数量1.2.2 求叶子结点个数1.2.3 求树高1.2.4 求第k层结点个数1.2.5 查找二叉树值为k的结点 1. 二叉树 空树非空&#xff…

跨境DNS解析失败问题解决

新钛云服已累计为您分享748篇技术干货 问题 公司使⽤的是阿⾥云基础设施&#xff0c;DNS解析使⽤的是境外的Akamai作为域名的DNS解析服务商。 当前有部分应⽤需要被第三⽅应⽤调⽤&#xff0c;同时也有主动调⽤第三⽅应⽤的需求。最近突发了很多调⽤失败问题。 应⽤调⽤失败&am…

YB时代,正寻找新的数据支点

每个人可能都想过这样一些问题&#xff1a;我们的地球&#xff0c;能够承载多少人口&#xff1f;地球上的石油和煤炭能用多久&#xff1f;碳排放的极限在哪里&#xff1f; 但你有没有想过&#xff0c;我们的地球&#xff0c;能够承载多少数据&#xff1f; 根据《数据存储2030白…

手把手教你打造自己的 AI 虚拟主播

零、写在前面一、 准备环境二、配置软件环境2.1 OBS 安装2.2. VTube Studio 安装 三、开启 B 站直播四、开启 AI 主播五、直播最终效果 零、写在前面 AI 直播在近年来得到了快速的发展和普及&#xff0c;它已经成为了直播平台的重要组成部分。目前&#xff0c;许多知名的直播平…

「读书感悟系列」生命的礼物 · 关于爱、死亡及存在的意义

作者 | gongyouliu 编辑 | gongyouliu 最近花了不到一周时间看完了著名的团体心理治疗大师欧文D.亚隆和他的妻子玛丽莲亚隆合著的这本『生命的礼物 关于爱、死亡及存在的意义』。这本书非常特别&#xff0c;这是玛丽莲在87岁得癌症后跟丈夫一起合作的&#xff0c;每人写一章&a…

URLConnection(二)

文章目录 1. 缓存2. Java的Web缓存 1. 缓存 Web浏览器会缓存页面和图片&#xff0c;将资源缓存在本地&#xff0c;每次需要时会从缓存中重新加载&#xff0c;而不是每次都请求远程服务器。一些HTTP首部&#xff08;包括Expires和Cache-Control&#xff09;可以控制首部。默认情…

OJ练习第116题——二进制矩阵中的最短路径(BFS)

二进制矩阵中的最短路径 力扣链接&#xff1a;1091. 二进制矩阵中的最短路径 题目描述 给你一个 n x n 的二进制矩阵 grid 中&#xff0c;返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径&#xff0c;返回 -1 。 二进制矩阵中的 畅通路径 是一条从 左上角 单元格&am…

记一次Redis消息订阅序列化和反序列化的错误

1、使用的SpringBoot&#xff1b; 2、Redis的Config配置了JSON序列化&#xff0c;覆盖JDK序列化&#xff0c;便于中文查看&#xff0c;配置文件使用ConditionalOnProperty断言&#xff1b; 3、Nacos动态配置&#xff1b; 解决思路&#xff1a; 1、查看Redis中存入的数据乱码&am…

最佳WP Grid Builder评测:灵活的网格和过滤器

当您坐下来观看足球比赛时&#xff0c;您从一英里外都很容易看到超级巨星。 时尚而精致的比赛让他们与众不同&#xff0c;并且比赛的结果经常改变。球迷和经理们都喜欢他们&#xff0c;因为当他们踢球时&#xff0c;他们处于绝对最佳状态。 这同样适用于音乐界的巨星。通常&a…

Go中的异常处理(基础)

Go 中异常处理 主要掌握 一下几个方面: 掌握error接口掌握defer延迟掌握panic及recover error接口 error是指程序中出现不正常的情况,从而导致程序无法正常运行; go中为错误的类型提供了简单的错误处理机制 go中error的源码: // The error built-in interface type is t…

舵机云台实现追踪球形目标功能

1. 功能说明 在样机舵机云台上安装一个摄像头&#xff0c;本文示例将实现舵机云台追踪球形物体的功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09;‍ 扩展板 Bi…

Linux之创建进程、查看进程、进程的状态以及进程的优先级

文章目录 前言一、初识fork1.演示2.介绍3.将子进程与父进程执行的任务分离4.多进程并行 二、进程的状态1.进程的状态都有哪些&#xff1f;2.查看进程的状态2.运行&#xff08;R&#xff09;3.阻塞4.僵尸进程&#xff08;Z&#xff09;1.僵尸状态概念2.为什么要有僵尸状态&#…

Rust每日一练(Leetday0011) 下一排列、有效括号、搜索旋转数组

目录 31. 下一个排列 Next Permutation &#x1f31f;&#x1f31f; 32. 最长有效括号 Longest Valid Parentheses &#x1f31f;&#x1f31f;&#x1f31f; 33. 搜索旋转排序数组 Search-in-rotated-sorted-array &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷…

开发 Microsoft 365 Copilot Plugin!

大家好&#xff01;我是韩老师。 昨天凌晨的微软 Build 大会&#xff0c;大家都看了吗&#xff1f; 我看到了凌晨两点&#xff0c;且毫无困意&#xff01; 真的是干货满满~ 列举几个比较大的发布&#xff1a;1. Windows Copilot2. Bing 成为 ChatGPT 的默认搜索体验3. AI 插件生…

一起看 I/O | 移动设备、Web、AI 和 Google Cloud 更新一览

作者 / Developer X 副总裁兼总经理、开发者关系主管 Jeanine Banks 感谢您再次与我们共享 Google I/O 大会的精彩&#xff01;我们正在持续深度投入资源来提升 AI、移动设备、Web 和 Google Cloud&#xff0c;致力于让您的开发工作更加轻松。现在&#xff0c;您看到了许多我们…