【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

相关文章

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

SpringBoot返回文件让前端下载的几种方式

《SpringBoot返回文件让前端下载的几种方式》文章介绍了开发中文件下载的两种常见解决方案,并详细描述了通过后端进行下载的原理和步骤,包括一次性读取到内存和分块写入响应输出流两种方法,此外,还提供... 目录01 背景02 一次性读取到内存,通过响应输出流输出到前端02 将文件流通过循环写入到响应输出流

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

前端Visual Studio Code安装配置教程之下载、汉化、常用组件及基本操作

《前端VisualStudioCode安装配置教程之下载、汉化、常用组件及基本操作》VisualStudioCode是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,... 目录一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2

交换机救命命令手册! 思科交换机排障命令汇总指南

《交换机救命命令手册!思科交换机排障命令汇总指南》在交换机配置与故障排查过程中,总会遇到那些“关键时刻靠得住的命令”,今天我们就来分享一份思科双实战命令手册... 目录1. 基础系统诊断2. 接口与链路诊断3. L2切换排障4. L3路由与转发5. 高级调试与日志6. 性能与QoS7. 安全与DHCP8.

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

通过React实现页面的无限滚动效果

《通过React实现页面的无限滚动效果》今天我们来聊聊无限滚动这个现代Web开发中不可或缺的技术,无论你是刷微博、逛知乎还是看脚本,无限滚动都已经渗透到我们日常的浏览体验中,那么,如何优雅地实现它呢?... 目录1. 早期的解决方案2. 交叉观察者:IntersectionObserver2.1 Inter

Vue3视频播放组件 vue3-video-play使用方式

《Vue3视频播放组件vue3-video-play使用方式》vue3-video-play是Vue3的视频播放组件,基于原生video标签开发,支持MP4和HLS流,提供全局/局部引入方式,可监听... 目录一、安装二、全局引入三、局部引入四、基本使用五、事件监听六、播放 HLS 流七、更多功能总结在 v