第42节——路由知识额外扩展

news/2024/7/15 17:01:30 标签: react.js, 前端, 前端框架, javascript

一、路由匹配规则

1、基本匹配规则

/path:精确匹配路径为 /path 的路由。

/path/subpath:精确匹配路径为 /path/subpath 的路由

import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';

<Router>
  <Routes>
    <Route path="/" element={<Home />} />
    <Route path="/about" element={<About />} />
  </Routes>
</Router>

2、动态参数匹配规则

import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';

<Router>
  <Routes>
    
    {/* 
          匹配路径为 /users/123、/users/abc 等任意值的路由,
          并将匹配到的值存储在 id 参数中
        */}
        <Route path="/users/:id" element={<UserProfile />} />
        {/* 
          匹配路径为 /users 或 /users/123 等任意值的路由,并将匹配到的值存储在 id 参数中,
          如果路径中不包含 id 参数,则 id 参数的值为 undefined
        */}
        <Route path="/users/:id?" element={<UserList />} />
        {/* 
          匹配路径为 /users/123、/users/456 等数字的路由,
          并将匹配到的值存储在 id 参数中,其中 \d+ 表示正则表达式,
          用于匹配一个或多个数字
        */}
  </Routes>
</Router>

3、嵌套路由匹配规则

React Router 6 中的嵌套路由需要子路由的 path 包含父级路由的 path

import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        {/*
          父级路由 /dashboard 对应的是 Dashboard 组件,
          而子路由 /dashboard/:id 对应的是 DashboardDetail 组件。
          子路由的 path 是完整的路径,包含了父级路由的 path。
          因此,当访问 /dashboard/123 路径时,React Router 会先匹配父级路由 /dashboard,
          然后再匹配子路由 /dashboard/:id,最终渲染 DashboardDetail 组件
        */}
        <Route path="/dashboard" element={<Dashboard />}>
          <Route path="/dashboard/:id" element={<DashboardDetail />} />
        </Route>
      </Routes>
    </Router>
  );
}

3、匹配所有路径

在 React Router 6 中,可以使用*来匹配所有路径

import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';

function App() {
  return (
    <Router>
      <Routes>
        {/*
          我们使用了通配符 * 来匹配所有以 /about/ 开头的路径,
          例如 /about, /about/team, /about/contact 等等。
          当用户访问这些路径时,都会渲染 AboutInfo 组件
        */}
        <Route path="/about/*" element={<about />} />
        <Route path="*" element={<NotFound />} />
      </Routes>
    </Router>
  );
}

二、代码分割

1、代码分割用来解决什么问题

React Router 在使用时,会把所有路由相关的组件都打包进同一个 JavaScript 文件中,这会导致整个应用的体积变得很大,加载时间变长。为了解决这个问题,我们可以使用代码分割(code splitting)技术,将不同的路由组件分别打包成不同的 JavaScript 文件,实现按需加载。

2、React.lazy

React.lazy 是 React 16.6.0 新引入的一个函数,它可以让你很容易地实现代码分割(code splitting),实现组件的按需加载。React.lazy() 函数接受一个函数作为参数,这个函数必须返回一个动态 import() 语句。

const MyComponent = React.lazy(() => import('./MyComponent'));

3、例子

React Router 提供了 React.lazy() 和 React.Suspense 来实现组件的懒加载。React.lazy() 是一个高阶函数,可以将一个动态 import() 语句包装成一个能够被渲染的组件,而 React.Suspense 则是一个组件,可以在组件加载时显示一个 loading 界面,等待组件加载完成后再显示实际内容。

import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
import React, { lazy, Suspense } from 'react';

// 使用 React.lazy() 和 import() 来分别定义了三个路由组件 
const Home = lazy(() => import('./Home'));
const About = lazy(() => import('./About'));
const Contact = lazy(() => import('./Contact'));
/**
使用 React.Suspense 包裹了整个 Routes 组件,
当路由组件还未加载完成时,会显示一个 "Loading..." 的提示信息
*/
function App() {
  return (
    <Router>
      <Suspense fallback={<div>Loading...</div>}>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/contact" element={<Contact />} />
        </Routes>
      </Suspense>
    </Router>
  );
}

三、路由 (V5) 和路由 (V6) 差异解读

react Router v6使用Hooks来实现路由,而v5使用高阶组件(HOCs)来实现路由。这是它们之间最大的区别。

1、路由配置

React Router v5中的路由配置需要将Route组件作为子组件嵌套在Switch组件中。而React Router v6中的路由配置方式发生了变化。现在,我们需要在Routes组件中使用数组来配置路由。

2、嵌套路由

在React Router v6中,嵌套路由的使用方式更加简单直观。在v5中,嵌套路由需要在组件之间进行深度传递props,而在v6中,可以使用嵌套路由。

3、状态管理

React Router v6通过提供useSearchParams、useLocation和useNavigate等Hooks,使得状态管理变得更加方便。这些Hooks可以帮助我们在不同的路由之间共享状态,而在v5中需要使用类似于redux等外部状态管理库来实现。

四、如何在类组件中使用

编写一个高阶组件

import React from "react";
import { useNavigate } from "react-router-dom";

export default function WithRouter(WarpComponent) {
  const navigate = useNavigate();
  return <WarpComponent {...this.props} navigate={navigate}></WarpComponent>;
}

http://www.niftyadmin.cn/n/5061769.html

相关文章

某房产网站登录RSA加密分析

文章目录 1. 写在前面2. 抓包分析3. 扣加密代码4. 还原加密 1. 写在前面 今天是国庆节&#xff0c;首先祝福看到这篇文章的每一个人节日快乐&#xff01;假期会老的这些天一直在忙事情跟日常带娃&#xff0c;抽不出一点时间来写东西。夜深了、娃也睡了。最近湖南开始降温了&…

Mysql时间同步设置

Mysql时间同步设置 当涉及到设置MySQL数据库时间与电脑同步时&#xff0c;实际的步骤可能会因操作系统和数据库版本的不同而有所差异。以下是一个基本的步骤示例&#xff0c;供您参考&#xff1a; 检查电脑时间&#xff1a; 首先确保电脑操作系统的时间是正确的。 设置MySQL时…

594.最长和谐子序列(滑动窗口)

目录 一、题目 二、代码 一、题目 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 二、代码 class Solution { public:int findLHS(vector<int>& nums) {sort(nums.begin(), nums.end());int left 0, right 0;int MaxLength 0;while…

Python实现自动重新运行指定python脚本

前言 本文是该专栏的第35篇,后面会持续分享python的各种干货知识,值得关注。 在工作上,有时候会遇到如下情况,需要对指定的python脚本进行重启。第一种情况,就是当python脚本执行结束之后,可以通过python再次自动重新执行该python脚本;第二种情况,当python脚本执行过程…

php实战案例记录(1)删除语句之TRUNCATE TABLE和DELETE FROM

TRUNCATE TABLE和DELETE FROM TRUNCATE TABLE和DELETE FROM都是用于删除表中数据的SQL语句&#xff0c;但它们之间存在一些明显的区别&#xff1a; 操作方式&#xff1a;TRUNCATE TABLE是通过一次性清空整个表的内容来删除数据&#xff0c;相当于删除并重新创建一个空表。而D…

李航老师《统计学习方法》第6章阅读笔记

逻辑斯谛回归&#xff08;logistic regression&#xff09;是统计学习中的经典分类方法。最大熵是概率模型学习的一个准则&#xff0c;将其推广到分类问题得到最大熵模型&#xff08;maximum entropy model&#xff09;。逻辑斯谛回归模型与最大熵模型都属于对数线性模型。 对数…

在服务器上使用nginx改变前端项目请求的url

location /app-dev {rewrite ^/app-dev/(.*) /$1 break;proxy_pass http://152.136.36.251:9999;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr; } location /请求后缀 { rewrite ^/app-dev/(.*) /$1 break; proxy_pass 想要的请求后端的url; …

Java之多线程综合练习小题一

2. 多线程综合练习 练习一&#xff1a;售票 需求&#xff1a; 一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒, 请用多线程模拟卖票过程并打印剩余电影票的数量 代码示例&#xff1a; public class MyThread extends Thread { ​//第一种方式实现多…