【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

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学