【React】《React 学习手册 (第2版) 》笔记-Chapter11-React Router

2024-06-19 08:04

本文主要是介绍【React】《React 学习手册 (第2版) 》笔记-Chapter11-React Router,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

十一、React Router
  1. 单页应用的一切内容都在同一个页面中,由 JavaScript 负责加载信息和变换 UI。如果没有路由方案,浏览器的很多功能,例如历史记录、收藏夹及前进和后退按钮都无法使用。路由为客户端请求定义端点,这些端点兼容浏览器的地址和历史记录对象。端点用于标识请求的内容,以便 JavaScript 加载和渲染相应的用户界面。

  2. 路由器的作用是为网站中的各部分设置路由。一个路由就是一个端点,即可在浏览器的地址栏中输入的地址。请求某个路由,应用将渲染相应的内容。

  3. 使用 React Router,我们要安装 React Router 和 React Router DOM。React Router DOM 供使用 DOM 的常规 React 应用使用。如果你编写的是 React Native 应用,要使用 react-router-native。

  4. 现在,我们不再渲染 App 组件,而是渲染 Router 组件。Router 组件把当前地址的有关信息传给内部嵌套的子组件。Router 组件只能使用一次,而且应该放在组件树中靠近根的位置上:

    import React from "react";
    import { render } from "react-dom";
    import App from "./App";import { BrowserRouter as Router } from "react-router-dom";render(<Router><App /></Router>,document.getElementById("root")
    );
    
  5. 接下来要配置路由。我们把路由配置放在 App.js 文件中。要渲染的各个路由嵌套在名为 Routes 的组件中。在 Routes 中,一个页面使用一个 Route 组件设置。

    import React from "react";
    import {Routes,Route,Redirect
    } from "react-router-dom";
    import {Home,About,Events,Products,Contact,Whoops404,Services,History,Location
    } from "./pages";function App() {return (<div><Routes><Route path="/" element={<Home />} /><Route path="about" element={<About />}><Routepath="services"element={<Services />}/><Routepath="history"element={<History />}/><Routepath="location"element={<Location />}/></Route><Routepath="events"element={<Events />}/><Routepath="products"element={<Products />}/><Routepath="contact"element={<Contact />}/><Redirectfrom="services"to="about/services"/><Route path="*" element={<Whoops404 />} /></Routes></div>);
    }export default App;
    
    • 这些路由告诉 React Router 在地址发送变化后渲染什么组件。每个 Route 组件都 path 和 element 属性。当浏览器中的地址匹配某个 path 时,显示对应的 element。
    • 可以在 Route 组件中嵌套 Route 组件(比如 About)。
    • 可以利用 Redirect 组件进行重定向(比如把访问 http://localhost:3000/services 的用户重定向到正确的路由 http://localhost:3000/about/services 上)。
  6. 我们可以使用 react-router-dom 提供的 Link 组件创建链接。下面来修改首页,加入指向各个路由的导航链接目录:

    import { Link } from "react-router-dom";export function Home() {return (<div><h1>[Company Website]</h1><nav><Link to="about">About</Link><Link to="events">Events</Link><Link to="products">Products</Link><Link to="contact">Contact Us</Link></nav></div>);
    }
    
  7. 我们可以使用当前地址值显示用户访问的路由:

    import { useLocation } from "react-router-dom";export function Whoops404() {let location = useLocation();console.log(location);return (<div><h1>Resource not found at {location.pathname}</h1></div>);
    }
    
  8. Router 组件只能使用一次,要路由的组件都嵌套在这个组件中。所有 Route 组件都嵌套在 Routes 组件中,根据浏览器中的当前地址选择渲染哪个组件。我们可以 Link 组件实现导航链接。

  9. Route 组件只在匹配特定的 URL 时显示对应的内容。利用这个功能可以按照严格的层次结构组织 Web 应用中的不同页面,促进内容重用。

  10. 嵌套路由时,若想显示嵌套内的组件(比如上面的 History),我们要使用 React Router DOM 的另一个特性:Outlet 组件。嵌套组件就使用 Outlet 组件渲染。想渲染子页面内容使用这个组件即可。

    import { Outlet } from "react-router-dom";export function About() {return (<div><h1>[About]</h1><Outlet /></div>);
    }export function History() {return (<section><h2>Our History</h2><p>Lorem ipsum dolor sit amet, consecteturadipiscing elit. Integer nec odio.Praesent libero. Sed cursus ante dapibusdiam. Sed nisi. Nulla quis sem at nibhelementum imperdiet. Duis sagittis ipsum.Praesent mauris. Fusce nec tellus sedaugue semper porta. Mauris massa.Vestibulum lacinia arcu eget nulla. Classaptent taciti sociosqu ad litora torquentper conubia nostra, per inceptoshimenaeos. Curabitur sodales ligula inlibero.</p></section>);
    }
    
    • 现在,“About”页面都将重用 About 组件,分别显示各个嵌套的组件。应用通过地址判断该显示哪个子部分。例如,访问 http://localhost:3000/about/history 地址,渲染的是 About 组件内部的 History 组件。
  11. Redirect 组件的作用是把用户重定向到指定的路由。

  12. 也可以使用 useRoutes 钩子配置应用的路由。

    import React from "react";
    import { useRoutes } from "react-router-dom";
    import {Home,About,Events,Products,Contact,Whoops404,Services,History,Location
    } from "./pages";function App() {let element = useRoutes([{ path: "/", element: <Home /> },{path: "about",element: <About />,children: [{path: "services",element: <Services />},{ path: "history", element: <History /> },{path: "location",element: <Location />}]},{ path: "events", element: <Events /> },{ path: "products", element: <Products /> },{ path: "contact", element: <Contact /> },{ path: "*", element: <Whoops404 /> },{path: "services",redirectTo: "about/services"}]);return element;
    }
    
    • Route 是对 useRoutes 的包装,其实使用哪种句法都可以。
  13. React Router 的另一个有用特性是为路由设置参数。路由参数是一种变量,作用是从 URL 中获取相应的值。路由参数在数据驱动型 Web 应用中特别有用,可用于筛选内容或管理显示偏好设置。下面举个例子:

    • 首先,打开 index.js 文件,设置路由器。
      import React from "react";
      import { render } from "react-dom";
      import { BrowserRouter as Router } from "react-router-dom";
      import App from "./Colors";render(<Router><App /></Router>,document.getElementById("root")
      );
      
      • 嵌套 App 组件之后,路由的所有属性都将传给它及它的子组件。
    • 然后,在 App 中添加路由。
      import React from "react";
      import { Routes, Route } from "react-router-dom";
      import AddColorForm from "./AddColorForm";
      import ColorList from "./ColorList";
      import { ColorDetails } from "./ColorDetails";
      import "./Colors.css";
      import { ColorProvider } from "./hooks";
      export * from "./hooks";export default function App() {return (<ColorProvider><AddColorForm /><Routes><Routepath="/"element={<ColorList />}></Route><Routepath=":id"element={<ColorDetails />}/></Routes></ColorProvider>);
      }
      
    • ColorDetails 组件根据颜色的 id 动态显示内容。例如,localhost:3000/00fdb4c5-c5bd-4087-a48f-4ff7a9d90af8。
      import React from "react";
      import { useColors } from "./";
      import { useParams } from "react-router-dom";export function ColorDetails() {let { id } = useParams();let { colors } = useColors();let foundColor = colors.find(color => color.id === id);return (<div><divstyle={{backgroundColor: foundColor.color,height: 100,width: 100}}></div><h1>{foundColor.title}</h1><h1>{foundColor.color}</h1></div>);
      }
      
  14. 我们想为这个颜色管理应用添加的另一个功能是,点击颜色列表中的某个颜色后打开 ColorDetails 页面。下面在 Colors 组件中添加这个功能。为此,我们要使用另一个路由器钩子 useNavigate,在用户点击该组件时打开详情页面。

    • 先从 react-router-dom 中导入这个钩子:
      import { useNavigate } from "react-router-dom";
      
    • 然后,调用 useNavigate 钩子,返回一个函数,导航到另一个页面:
      let navigate = useNavigate();
      
    • 接下来,为 section 元素添加一个 onClick 处理函数,根据颜色的 id 导航到正确的路由:
      let navigate = useNavigate();return (<sectionclassName="color"onClick={() => navigate(`/${id}`)}>// Color 组件</section>
      );
      
    • 现在,单击这个 section 元素就可以转到正确的页面了。
  15. 路由参数是获取影响用户界面呈现内容所需数据的理想工具。然而,我们应该只在希望用户从 URL 中捕获这些信息时才使用。

这篇关于【React】《React 学习手册 (第2版) 》笔记-Chapter11-React Router的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1074454

相关文章

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

CSS will-change 属性示例详解

《CSSwill-change属性示例详解》will-change是一个CSS属性,用于告诉浏览器某个元素在未来可能会发生哪些变化,本文给大家介绍CSSwill-change属性详解,感... will-change 是一个 css 属性,用于告诉浏览器某个元素在未来可能会发生哪些变化。这可以帮助浏览器优化

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目