Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >React Router 6 (React路由) 最详细教程

React Router 6 (React路由) 最详细教程

原创
作者头像
蒋川
发布于 2022-03-28 18:31:05
发布于 2022-03-28 18:31:05
24.8K3
举报
文章被收录于专栏:卡拉云卡拉云
react-draggable
react-draggable

React Router 经历多个版本的发展,现在已经到了 React Router 6。虽然网络上写 React-Router 路由本身的教程很多,但真正讲到 React-Router 6 的并不多。同时因为第 6 版引入了很多新的概念,以及大量使用 Hook,因此网上的很多旧教程已经不实用了。这篇文章里我们总结 React Router 6 路由器的用法,用例子说明如何实现各种场景和需求,比如程序化跳转等等。

React Router 6
React Router 6

在卡拉云中,我们也大量地使用了 React-Router 6,所以在讲解过程中我们会用一些在实际使用的例子来说明问题,但本文的主要例子会放在 github 仓库中,方便你参考。如果你觉得有用,不妨分享和加星,或在博客中链回本文,让更多人看到。

本系列中其它优秀教程请参考

当然如果你希望快速搭建后台系统,也推荐尝试卡拉云,可以免掉前后端开发、维护的烦恼

什么是 React-Router

要理解什么是 React-Router 就要先理解什么是 SPA (Single Page Application),也就是俗称的单页应用。

每个单页应用其实是一系列的 JS 文件,当用户请求网站时,网站返回一整个(或一系列)的 js 文件和 HTML,而当用户在某个页面内点击时,你需要告诉浏览器怎么加载另一个页面地址。单页应用中通常只有一个 index.html 文件的,所以浏览器自带的 <a> 链接 tag 并不能用来做单页应用的跳转,因此你需要一个在 React 中的路由实现。

然而 React 框架本身是不带路由功能的,因此如果你需要实现路由功能让用户可以在多个单页应用中跳转的话,就需要使用 React-Router。

React-Router 从 2014 年开始开发,到现在已经经历了 6 次大版本迭代,而从它的使用者来看,Netflix, Twitter, Discord 等等大厂纷纷背书,因此 React-Router 已经基本成了在 React 中做路由的默认选项。如果你现在还在用老的版本,想要升级,那么可以参考升级教程,否则的话可以一步步参考本文。

在读完本文后,你应该可搭起来如下这样的简单应用,用一个导航栏控制用户可以访问的页面,同时保护某些页面,必须在用户登录后才可以进入。

react-router示例
react-router示例

虽然这个应用看起来简单,但是它却包含了 React-Router 中常见的功能和 API,包括

  • BrowserRouter
  • Link
  • Routes
  • Route
  • Outlet

等等

如何安装 React-Router

安装 React-Router 非常简单,如果你使用的是 yarn 或者 npm,则用通常的安装方式即可

我们先用 create-react-app 脚手架建起一个 app 来

代码语言:txt
AI代码解释
复制
npx create-react-app react-router-6-tutorial

然后用 npm 安装

如果使用 npm 的话则是

npm install react-router-dom@6

yarn 安装

yarn add react-router-dom@6

这样 react-router 就安装好了。注意如果在 web 上的话,你需要的是 react-router-dom 而不是 react-router 这个包。它们的区别是,后者包含了 react-native 中需要的一些组件,如果你只需要做网页应用的话,用前者就可以了

React Router API

React Router 的 API 在它的官方文档上已经介绍得比较清楚了,我们这里简单地总结一下几个可能用到的 API。具体的用法在下文中我们详细来讲,这里只是作为参考,如果碰上问题可以查一查

BrowserRouter

在 React Router 中,最外层的 API 通常就是用 BrowserRouter。BrowserRouter 的内部实现是用了 history 这个库和 React Context 来实现的,所以当你的用户前进后退时,history 这个库会记住用户的历史记录,这样需要跳转时可以直接操作。

BrowserRouter 使用时,通常用来包住其它需要路由的组件,所以通常会需要在你的应用的最外层用它,比如如下

代码语言:txt
AI代码解释
复制
import ReactDOM from 'react-dom'
import * as React from 'react'
import { BrowserRouter } from 'react-router-dom'
import App from './App`

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
, document.getElementById('app))

Route

Route 用来定义一个访问路径与 React 组件之间的关系。比如说,如果你希望用户访问 https://your_site.com/about 的时候加载 <About /> 这个 React 页面,那么你就需要用 Route:

代码语言:txt
AI代码解释
复制
<Route path="/about" element={<About />} />

Routes

Routes 是用来包住路由访问路径(Route)的。它决定用户在浏览器中输入的路径到对应加载什么 React 组件,因此绝大多数情况下,Routes 的唯一作用是用来包住一系列的 Route,比如如下

代码语言:txt
AI代码解释
复制
import { Routes, Route } from "react-router-dom";

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
    </Routes>
  );
}

在这里,Routes 告诉了 React Router 每当用户访问根地址时,加载 Home 这个页面,而当用户访问 /about 时,就加载 <About /> 页面。

React Router 实操案例

在上文中我们介绍了 React Router 的 API,余下全文中我们用一个实例来说明如何使用 React Router。

首先我们建起几个页面

代码语言:txt
AI代码解释
复制
<Home />

<About />

<Dashboard />

Home 用于展示一个简单的导航列表,About用于展示关于页,而 Dashboard 则需要用户登录以后才可以访问。

首先我们新建一个 router.js 文件,并在其中加载好 React-Router 组件

代码语言:txt
AI代码解释
复制
import './App.css';
import { BrowserRouter, Route, Routes } from "react-router-dom"

function App() {

  return <BrowserRouter>
    <Routes>
      <Route path="/" element={<Home />} />
    </Routes>
  </BrowserRouter>
}

const Home = () => {
  return <div>hello world</div>
}

export default App;

这里我们直接在 App.js 中加上一个叫 Home 的组件,里面只是单纯地展示 hello wolrd 而已。接下来,我们再把另外两个路径写好,加入 About 和 Dashboard 两个组件

代码语言:txt
AI代码解释
复制
import './App.css';
import { BrowserRouter, Route, Routes } from "react-router-dom"

function App() {

  return <BrowserRouter>
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
      <Route path="/dashboard" element={<Dashboard />} />
    </Routes>
  </BrowserRouter>
}

const Home = () => {
  return <div>hello world</div>
}

const About = () => {
  return <div>这里是卡拉云的主页</div>
}

const Dashboard = () => {
  return <div>今日活跃用户: 42</div>
}

export default App;

此时,当我们在浏览器中切换到 / 或 /about 或 /dashboard 时,就会显示对应的组件了。注意,在上面每个 Route 中,用 element 项将组件传下去,同时在 path 项中指定路径。在 Route 外,用 Routes 包裹起整路由列表。

写到这里,我们其实已经完成了一个基本的路由功能,对于绝大多数可以公开访问的网站(或者内部系统),这差不多就已经完结的。但有时,你可能希望知道用户所在的路径,来做一些对应显示和特殊逻辑处理,或者是你需要让用户鉴权后才能访问某个路径,那么你需要继续读一下后文几个章节

如何获取当前页路径

如何在 React-Router 中获取当前用户在访问的页面的路径?其实很简单,在 React-Rotuer 6 中,提供了一个 hook 钩子,专门用来获得当前路径。在上文的例子中,我们只需要在对应的页面里,比如 About 中,加上这个 hook 就可以了

首先我们导入 useLocation 这个 hook,然后仿照如下代码就可以获得当前位置

代码语言:txt
AI代码解释
复制
import { useLocation } from 'react-router-dom'

const About = () => {
  // 使用 hook
  const location = useLocation();
  const { from, pathname } = location

  return <div>这里是卡拉云的网站,你当前在 {pathname},你是从 {from} 跳转过来的</div>
}

如何设置默认页路径(如 404 页)

在上文的路由列表 Routes 中,我们可以加入一个 catch all 的默认页面,比如用来作 404 页面。

我们只要在最后加入 path 为 * 的一个路径,意为匹配所有路径,即可

代码语言:txt
AI代码解释
复制
function App() {

  return <BrowserRouter>
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
      <Route path="/dashboard" element={<Dashboard />} />
      <Route path="*" element={<NotFound />} />
    </Routes>
  </BrowserRouter>
}

// 用来作为 404 页面的组件
const NotFound = () => {
  return <div>你来到了没有知识的荒原</div>
}

当然你可以把 404 页面做得更好看一点,比如卡拉云中如果访问不存在的链接的话,404 页面如下

卡拉云 404 页面
卡拉云 404 页面

如何用 React Router 鉴权并保护路径

总结

本文中我们介绍了如何使用 React-Router,用一个实例说明 React Router 6 中的 API,以及常见的使用场景等。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
3 条评论
热度
最新
React Router 实操案例中说新建一个 router.js,后面都没用到,然后就直接在App.js里写入所有路由了。感觉router.js多余;如何用 React Router 鉴权并保护路径? 写了目录标题没写内容详细呀 咋就结束了。
React Router 实操案例中说新建一个 router.js,后面都没用到,然后就直接在App.js里写入所有路由了。感觉router.js多余;如何用 React Router 鉴权并保护路径? 写了目录标题没写内容详细呀 咋就结束了。
回复回复1举报
好家伙,这个平台看的第一篇文章居然烂尾了。。。
好家伙,这个平台看的第一篇文章居然烂尾了。。。
回复回复点赞举报
是烂尾了么。router里面的东西也没抽离出来呀
是烂尾了么。router里面的东西也没抽离出来呀
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
React Router V6详解
SAP全称是【single-page application】,中文译为单页面应用。它是网站应用的一种模型,可以动态重写当前的页面来与用户交互,而不需要重新加载整个页面。相对于传统的 Web 应用程序,单页应用做到了前后端分离,即后端只负责处理数据提供接口,而页面逻辑和页面渲染都交由前端处理。前端发展到现在,单页应用的使用已经很广泛,目前时兴的 React、Vue、Angular 等前端框架均采用了 SPA 原则。
xiangzhihong
2023/01/06
8K0
react-react-dom v6 知识整合
1. BrowserRouter / HashRouter 相当于容器(类似router-view),用于指定路由的模式
用户9914333
2022/12/14
6.5K0
react-react-dom v6 知识整合
React Router 邦邦两拳🥊 🥊
这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」 简介
用户4793865
2023/01/12
3.5K0
react-router-dom使用指南(最新V6)
注意:BrowserRouter组件最好放在最顶层所有组件之外,这样能确保内部组件使用 Link 做路由跳转时不出错
江一铭
2022/09/23
4.6K0
React-Router-基本使用
路由维护了 URL 地址和组件的映射关系, 通过这个映射关系, 我们就可以根据不同的 URL 地址,去渲染不同的组件。
杨不易呀
2023/09/30
2840
React-Router V6 使用详解
2.去除Switch中的<Redirect>,用react-router-dom中的Redirect 替代,或者用 <Navigate> 实现
程序狗
2021/12/17
3.9K0
React Router初学者入门指南(2023版)
如果你对React Router还不熟悉,你可能习惯使用普通的链接(a标签)在你的应用程序中进行导航。然而,当你想在导航时保留应用程序的当前状态时,就会出现问题。不幸的是,普通的链接通常会触发页面刷新来显示组件,从而破坏用户体验。这就是React Router的用武之地。
前端达人
2023/10/27
8460
React Router初学者入门指南(2023版)
React Router 路由
https://react-router.docschina.org/ 分三个版本: web native anywhere
P轴
2022/11/18
7670
React-Router v6
当然,还有更酸爽的操作,直接在路由里定义<Route>的<Route>,然后用接下来的一个新API:Outlet
biaoblog.cn 个人博客
2022/08/11
1.9K0
React-Router v6
react-router4
react-router是一些封装好的组件用于前端路由,当我们点击的时候会出现一个虚拟的路由,并不会做页面的全刷新,实现不同组件之间的切换和跳转。(当然react-router里面把history.js这个库做了封装,history.js是基于window.history做的封装,所以react-router可以调用一些会话历史, history 知道如何去监听浏览器地址栏的变化, 并解析这个 URL 转化为 location 对象, 然后 router 使用它匹配到路由,最后正确地渲染对应的组件。)
_kyle
2020/08/24
1.6K0
react-router4
如何测试 React 路由 ?
本文承接上文 如何测试 React 异步组件?,这次我将继续使用 @testing-library/react 来测试我们的 React 应用,并简要简要说明如何测试路由系统。
狂奔滴小马
2022/01/20
2.2K0
React Router3到5 升级小记
不光是你在用,我们很多项目也在用,懒得升级,感觉改动太大,升级了后谁知道会出什么问题,别没事找事。
zz_jesse
2020/03/17
2.3K0
React 进阶 - React Router
用 React 或者 Vue 构建的应用都是单页面应用,单页面应用是使用一个 HTML 前提下,一次性加载 JavaScript , CSS 等资源,所有页面都在一个容器页面下,页面切换实质是组件的切换。
Cellinlab
2023/05/17
2K0
React 进阶 - React Router
React 16 - 生态:React Router
React Router 为什么要用路由? 单页应用需要进行页面切换 通过 URL 可以定位到页面 路由不只是页面切换,更有语义的组织资源 基本架构 使用 <Router> <div> <ul> <li><Link to="/">Home</Link></li> <li><Link to="/about">About</Link></li> <li><Link to="/topics">Topics</Link></li> </ul>
Cellinlab
2023/05/17
7350
React 16 - 生态:React Router
【路由】:路由那些事——上
前端三杰 Angular、React、Vue 都推荐单页面应用 SPA 开发模式,它们都有自己的前端路由解决方案:
WEBJ2EE
2021/04/07
1.9K0
React路由
现代的前端应用大多都是 SPA(单页应用程序),也就是只有一个 HTML 页面的应用程序。因为它的用户体验更好、对服务器的压力更小,所以更受欢迎。为了有效的使用单个页面来管理原来多页面的功能,前端路由应运而生。
用户10169043
2022/11/21
2K0
React路由
react-router 的使用与优化
react-router 可以创建单页应用。可以将组件映射到路由上,将对应的组件渲染到想要渲染的位置(根据路径的变化渲染出组件)。
多云转晴
2020/03/11
3.3K0
145. 精读《React Router v6》
React Router v6 alpha 版本发布了,本周通过 A Sneak Peek at React Router v6 这篇文章分析一下带来的改变。
黄子毅
2022/03/14
1.3K0
react-router学习笔记
React Router 保持 UI 与 URL 同步。它拥有简单的 API 与强大的功能例如代码缓冲加载、动态路由匹配、以及建立正确的位置过渡处理。
Tiffany_c4df
2020/09/24
2.8K0
使用React-Router实现前端路由鉴权
React-Router是React生态里面很重要的一环,现在React的单页应用的路由基本都是前端自己管理的,而不像以前是后端路由,React管理路由的库常用的就是React-Router。本文想写一下React-Router的使用,但是光介绍API又太平淡了,而且官方文档已经写得很好了,我这里就用一个常见的开发场景来看看React-Router是怎么用的吧。我们一般的系统都会有用户访问权限的限制,某些页面可能需要用户具有一定的权限才能访问。本文就是用React-Router来实现一个前端鉴权模型。
蒋鹏飞
2020/10/15
2.4K0
使用React-Router实现前端路由鉴权
相关推荐
React Router V6详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档