- ReactJS 菜鸟教程
- ReactJS 教程
- ReactJS - 简介
- ReactJS - 安装
- ReactJS - 特性
- ReactJS - 优点和缺点
- ReactJS - 架构
- ReactJS - 创建 React 应用程序
- ReactJS - JSX
- ReactJS - 组件
- ReactJS - 嵌套组件
- ReactJS - 使用组件
- ReactJS - 组件集合
- ReactJS - 样式
- ReactJS - 属性(props)
- ReactJS - 使用属性创建组件
- ReactJS - props 验证
- ReactJS - 构造函数
- ReactJS - 组件生命周期
- ReactJS - 事件管理
- ReactJS - 创建事件感知组件
- ReactJS - 在Expense Manager APP中引入事件
- ReactJS - 状态管理
- ReactJS - 状态管理 API
- ReactJS - 无状态组件
- ReactJS - 使用 React Hooks 进行状态管理
- ReactJS - 使用 React 钩子的组件生命周期
- ReactJS - 组件的布局
- ReactJS - 分页
- ReactJS - Material 用户界面
- ReactJS - Http 客户端编程
- ReactJS - 表单编程
- ReactJS - 受控组件
- ReactJS - 不受控制的组件
- ReactJS - Formik
- ReactJS - 条件渲染
- ReactJS - 列表
- ReactJS - 键
- ReactJS - 路由
- ReactJS - 冗余
- ReactJS - 动画
- ReactJS - 引导程序
- ReactJS - 地图
- ReactJS - 表格
- ReactJS - 使用 Flux 管理状态
- ReactJS - 测试
- ReactJS - CLI 命令
- ReactJS - 构建和部署
- ReactJS - 示例
- ReactJS - 钩子简介
- ReactJS - 使用 useState
- ReactJS - 使用 useEffect
- ReactJS - 使用 useContext
- ReactJS - 使用 useRef
- ReactJS - 使用 useReducer
- ReactJS - 使用 useCallback
- ReactJS - 使用 useMemo
- ReactJS - 自定义钩子
- ReactJS - 可访问性
- ReactJS - 代码拆分
- ReactJS - 上下文
- ReactJS - 错误边界
- ReactJS - 转发引用
- ReactJS - 片段
- ReactJS - 高阶组件
- ReactJS - 与其他库集成
- ReactJS - 优化性能
- ReactJS - 分析器 API
- ReactJS - 门户
- ReactJS - 没有 ES6 ECMAScript 的 React
- ReactJS - 没有 JSX 的 React
- ReactJS - 协调
- ReactJS - 引用和 DOM
- ReactJS - 渲染属性
- ReactJS - 静态类型检查
- ReactJS - 严格模式
- ReactJS - Web 组件
- ReactJS - 日期选择器
- ReactJS - Helmet
- ReactJS - 内联样式
- ReactJS - 属性类型
- ReactJS - 浏览器路由器
- ReactJS - DOM
- ReactJS - 旋转木马
- ReactJS - 图标
- ReactJS - 表单组件
- ReactJS - 参考 API
ReactJS - 浏览器路由器
路由是前端应用程序中的重要概念之一。React 社区提供了一个优秀的路由器库,叫做 React Router。在本章中,让我们学习 React 路由器的概念以及如何在 react 应用程序中使用它。
路由器概念
路由器的主要目的是将给定的 url 与 react 组件匹配并渲染匹配的组件。除了匹配和渲染之外,路由器还应该管理浏览器的历史记录,以便在浏览器中有效地向前和向后导航。
在了解路由器的工作原理之前,让我们了解 react 路由器库的一些有用组件。
BrowserRouter - BrowserRouter是顶级组件。它创建一个历史记录(导航历史记录),将初始位置(表示“用户所在位置”的路由器对象)置于反应状态,最后订阅位置 URL。
<BrowserRouter>
<!-- children -->
</BrowserRouter>
路由 - 路由将递归其子节点并构建路由器配置。它将配置的路由与位置进行匹配,并呈现第一个匹配的路由元素。
<BrowserRouter>
<Routes>
<Route path="/" element={<App />}>
<Route index element={<Home />} />
<Route path="admin" element={<Admin />}>
<Route path="product" element={<ProductListing />} />
<Route path="category" element={<CategoryListing />} />
<Route index element={<Dashboard />} />
</Route>
</Route>
<Route path="/login" element={<Login />}>
<!-- more nested routes -->
</Route>
<!-- more routes -->
</Routes>
</BrowserRouter>
这里
- /path 映射到 App 组件。
- /path 索引组件映射到 Home 组件。
- /admin 路径映射到 Admin 组件。
- /admin 路径的索引组件映射到 Dashboard 组件。
- /admin/product 路径与 ProductListing 组件匹配。
- /admin/category 路径与 CategoryListing 组件匹配。
- /admin/dashboard 路径与 Dashboard 组件匹配。
路由 - 路由是实际的路由器配置。它可以嵌套到类似于文件夹的任何级别。
Outlet - Outlet 组件呈现一组匹配项中的下一个匹配项。
function Hello() {
return (
<div>Hello</div>
<Outlet />
)
}
这里
- 将 Outlet 组件放置在 你好组件的底部。
- Router 将在 Outlet 组件内呈现下一个匹配项。
链接 - 链接组件类似于锚标签,用于导航目的。一旦用户点击它,它就会根据它的位置改变到道具的位置
<Link to="/admin" />
navigate() − navigate() 是一个用于导航目的的 API,类似于 Link 组件。
navigate("/admin")
路由器工作流
让我们考虑一个 react 应用程序有两个 5 个页面/组件,如下所示 -
- 家 (/)
- 联系方式 (/contact)
- 注册 (/register)
- 管理员 (/admin)
- AdminDashboard (/admin/dashboard)
路由器配置示例如下 -
<BrowserRouter>
<Routes>
<Route path="/" element={<App />}>
<Route index element={<Home />} />
<Route path="contact" element={<Contact />} />
<Route path="register" element={<Register />} />
<Route path="admin" element={<Admin />}>
<Route path="dashboard" element={<AdminDashboard />} />
<Route path="category" element={<CategoryListing />} />
<Route index element={<AdminDashboard />} />
</Route>
</Routes>
</BrowserRouter>
让我们看看 react 路由器将如何匹配和呈现管理员仪表板 url (/admin/dashboard)。
- 首先,react 库将渲染我们的应用程序。由于我们的应用程序将 BrowserRouter 位于渲染树的顶部,因此它会被调用并呈现
- BrowserRouter 组件创建一个历史记录,将初始位置置于状态并订阅 url
- 路由组件将检查其所有子项,构建路由器配置,最后呈现第一个匹配项 (/admin => )
- 将呈现 Admin 组件。它将有一个 Outlet 组件,如下所示 -
function Admin() {
return (
<div>
<!-- Admin content -->
</div>
<Outlet />
)
}
- Outlet 组件在其自身内呈现下一个匹配项 (/admin/dashboard => )
- 用户可以在仪表板中单击链接(链接组件),例如“/admin/category”
- 链接组件调用 navigate(“/admin/category”) 方法
- 历史记录(对象)更改 url 并通知 BrowserRouter
- 由于 BrowserRouter 组件已经订阅了 url,因此 BrowserRouter 组件将被重新渲染,并且整个过程将重复(从 2 开始)
如何应用路由器
首先,创建一个新的 react 应用程序并使用以下命令启动它。
cd myapp
npm start
接下来,使用以下命令安装 react 路由器库,
接下来,打开 App.css (src/App.css) 并删除所有 CSS 类。
// remove all css classes
接下来,在 src 下创建一个文件夹 Pages,并创建一个新的主页组件 Home (src/Pages/Home.js) 并呈现简单的主页内容,如下所示 -
function Home() {
return <h3>Home</h3>
}
export default Home
接下来,创建一个新的问候页面组件 Greeting (src/Pages/Greeting.js) 并呈现简单的问候语,如下所示 -
function Greeting() {
return <h3>Hello World!</h3>
}
export default Greeting;
接下来,打开App.js文件并渲染一个 BrowserRoutes 组件,如下所示 -
import './App.css'
import React from 'react';
import { BrowserRouter, Route, Routes } from 'react-router-dom';
import Layout from './Pages/Layout';
import Home from './Pages/Home';
import Greeting from './Pages/Greeting';
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="greet" element={<Greeting />} />
</Route>
</Routes>
</BrowserRouter>
);
}
export default App;
这里
- BrowserRouter 是主要组件。它将路由器设置作为其子项,并根据路由器设置呈现整个应用程序。
- 路由是主要的路由器组件。它包含单个路由器设置的列表。
- Route 是实际的路由器组件,在 Web 路径 (/home) 和组件 (Home) 之间进行映射。
- 路由可以嵌套以支持嵌套路径。
路由中定义的映射如下 -
- / 映射到 Layout 组件。布局组件将在下一步中创建。
- /home 映射到 Home 组件,并嵌套在 / path 下。
- /greet 映射到 Greet 组件,并且它嵌套在 / path 下。
接下来,创建一个 Layout 组件 Layout (src/Pages/Layout.js)。布局组件的目的是通过导航链接显示整个应用程序。它是应用程序的主要组成部分,指向/路由。Layout组件的源代码如下:
import { Outlet, Link } from "react-router-dom";
function Layout() {
return (
<>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/greet">Greeting</Link>
</li>
</ul>
</nav>
<Outlet />
</>
)
}
export default Layout;
这里
- 导入的 Link 和 Outlet 组件。
- 链接组件用于创建 Web 导航链接。
- link 组件的 to props 使用父 BrowserRouter 组件中定义的路由之一进行设置。
- 路由器设置中可用的 / 和 /greet 路由。
- 出口组件用于底部,用于加载所选组件。在初始渲染期间,它将加载默认组件(home)。
- 一旦用户点击网页链接,它将从 to 属性获取路由器路径,并通过路由器设置获取映射的组件。最后,它将在 Outlet 组件内呈现组件。
接下来,创建一个新组件 PageNotAvailable (src/Pages/PageNotAvailable.js),以在链接与任何路由器设置不匹配时显示。
import { Link } from "react-router-dom"
function PageNotAvailable() {
return (
<p>The page is not available. Please <Link to=
"/">click here</Link> to go to home page.</p>
)
}
export default PageNotAvailable
在这里,链接组件用于导航回主页。
接下来,更新 App 组件,并在路由器设置中包含 PageNotAvailable 组件。
import './App.css'
import React from 'react';
import { BrowserRouter, Route, Routes } from 'react-router-dom';
import Layout from './Pages/Layout';
import Home from './Pages/Home';
import Greeting from './Pages/Greeting';
import PageNotAvailable from './Pages/PageNotAvailable'
function App() {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<Layout />}>
<Route index element={<Home />} />
<Route path="greet" element={<Greeting />} />
<Route path="*" element={<PageNotAvailable />} />
</Route>
</Routes>
</BrowserRouter>
);
}
export default App;
这里
- 当用户点击一个链接时,react router 会尝试按照给定的顺序逐个匹配点击的链接和路由器设置。如果链接匹配,则 React 路由器将停止并渲染匹配的组件。
- * 模式将匹配所有链接。由于它被放置在最后一个条目中,因此它将匹配所有未定义/未知的链接。
接下来,更新 Layout 组件并添加不可用链接,以检查 PageNotAvailable 组件是否已正确配置。
import { Outlet, Link } from "react-router-dom";
function Layout() {
return (
<>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/greet">Greeting</Link>
</li>
<li>
<Link to="/unknown">Unavailable page</Link>
</li>
</ul>
</nav>
<Outlet />
</>
)
}
export default Layout;
最后,在浏览器中打开应用程序并检查最终结果。应用程序将如下所示 -
用户可以使用导航链接导航到任何页面,如上述输出所示。
总结
React 路由器易于配置和使用。它没有那么多花哨的功能,但具有链接、出口、路线和路线等必要功能,可以创建带有导航链接的完整 Web 应用程序。