当前位置: 首页 > news >正文

前端React Router从入门到进阶实战

React Router 是 React 应用中的一个重要库,它用于实现客户端的路由管理,能够将 URL 路径与 React 组件关联起来,从而实现页面之间的导航。React Router 不会像传统的多页面应用那样重新加载页面,而是通过组件切换来呈现不同的视图,这使得 React 应用能够拥有更高的性能和更流畅的用户体验。

React Router 是 React 生态中最常用的路由库,用于在 React 应用中处理页面的导航和路由。它允许开发者通过 URL 映射到不同的组件,从而创建单页应用(SPA)。React Router 通过声明式方式管理路由的配置,支持嵌套路由、动态路由、路由守卫、重定向等功能。

知识框架

1. React Router 基本概念

1.1 路由与组件的关系

React Router 的核心思想是将 URL 与组件关联,匹配到某个路由时,渲染对应的组件。

  • Route:表示路径与组件的映射关系。
  • Link:在应用中跳转到不同路由的组件。
  • BrowserRouter / HashRouter:为应用提供路由管理,BrowserRouter 使用 HTML5 历史 API,HashRouter 使用哈希值。
1.2 路由的核心组件
  • BrowserRouter / HashRouter:路由容器,包裹整个应用,提供路由的上下文。
  • Route:定义路径与组件的映射关系。
  • Link:用于在应用中进行导航,跳转到指定的路由。
  • Switch(React Router v5及以前)/ Routes(React Router v6及以后):用来确保一次只渲染一个匹配的路由。
1.3 路由的生命周期

React Router 会监听 URL 的变化,当 URL 发生变化时,它会匹配最合适的 Route,并渲染对应的组件。

2. React Router 版本变化

2.1 React Router v5
  • Switch:只有第一个匹配的 Route 会被渲染。Switch 用于包裹路由,并确保在多个路由中,只渲染一个匹配的路由。
  • exact:路由精确匹配,表示路径需要完全匹配才会渲染组件。
2.2 React Router v6
  • Routes:取代了 v5 中的 Switch,用于确保只有一个路由匹配时才会渲染。
  • Route:v6 中的 Route 不再有 exact 属性,所有的路由默认都是精确匹配的。
  • useNavigate:取代了 v5 中的 history.push,用于在函数组件中进行编程式导航。
  • useRoutes:允许通过配置对象定义路由,简化路由配置和动态路由。
  • Outlet:在父路由组件中渲染子路由的占位符。

3.React Router 主要组件

1. Router 组件

React Router 提供了多个 Router 组件来管理路由:

  • <BrowserRouter>:通过 HTML5 的 history API 来保持 UI 和 URL 同步。这是大多数单页应用的推荐使用方式。
  • <HashRouter>:通过 URL 中的 hash 部分(# 后面的部分)来管理路由,适用于不支持 history API 的环境。
  • <MemoryRouter>:使用内存中的路由,适用于非浏览器环境(比如服务器端渲染、React Native)。
import { BrowserRouter as Router } from 'react-router-dom';function App() {return (<Router>{/* 路由定义和组件 */}</Router>);
}
2. Route 组件

<Route> 用于定义路径和渲染的组件。它根据当前路径来判断是否匹配,并渲染对应的组件。

import { Route } from 'react-router-dom';<Route path="/home" component={Home} />
  • path:定义匹配的路径,支持通配符(例如 /post/:id)。
  • component:匹配路径时渲染的组件(React Router v5)。在 v6 中使用 element 属性来渲染组件。
  • renderchildren:可以提供渲染函数来返回动态内容。
3. Link 组件

<Link> 用于在不同的路由之间进行导航。它通过 to 属性指定目标路由。

import { Link } from 'react-router-dom';<Link to="/about">About</Link>
4. Switch / Routes 组件
  • <Switch>:在 React Router v5 中,<Switch> 用于包裹多个 <Route>,确保一次只渲染一个匹配的路由。
  • <Routes>:在 React Router v6 中,<Switch> 被替换为 <Routes>,它同样确保只渲染第一个匹配的路由。
import { Routes, Route } from 'react-router-dom';<Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} />
</Routes>
5. useNavigate (React Router v6)

useNavigate 是一个钩子,用于在函数组件中进行编程式导航。

import { useNavigate } from 'react-router-dom';const SomeComponent = () => {const navigate = useNavigate();const goToHome = () => {navigate('/home');};return <button onClick={goToHome}>Go to Home</button>;
};
6. useParams

useParams 是一个钩子,用于在路由中获取动态参数(如路径中的 :id)。

import { useParams } from 'react-router-dom';const Post = () => {const { id } = useParams(); // 获取 URL 参数return <div>Post ID: {id}</div>;
};
7. useLocation

useLocation 可以访问当前 URL 的信息(路径、查询参数等)。

import { useLocation } from 'react-router-dom';const CurrentLocation = () => {const location = useLocation();return <div>Current path: {location.pathname}</div>;
};
8. useMatch

useMatch 用来检查当前的 URL 是否与某个路径匹配,并获取路由参数。

import { useMatch } from 'react-router-dom';const MatchTest = () => {const match = useMatch('/post/:id');return match ? <div>Matched Post ID: {match.params.id}</div> : <div>No match</div>;
};

4.React Router 高级用法

1. 嵌套路由

React Router 支持路由嵌套,父组件的路由可以嵌套显示子路由。通过 <Outlet> 占位符渲染子路由。

import { Routes, Route, Outlet } from 'react-router-dom';const Dashboard = () => (<div><h2>Dashboard</h2><Outlet />  {/* 子路由会渲染在这里 */}</div>
);const Settings = () => <div>Settings Page</div>;function App() {return (<Routes><Route path="/dashboard" element={<Dashboard />}><Route path="settings" element={<Settings />} /></Route></Routes>);
}
2. 路由重定向

React Router 允许通过 <Navigate> 实现路由重定向(在 v6 中取代了 v5 中的 <Redirect>)。

import { Navigate } from 'react-router-dom';<Route path="/old-path" element={<Navigate to="/new-path" />} />
3. 路由守卫

React Router 本身没有内置的路由守卫功能,但可以通过编程方式实现。例如,如果用户没有登录,可以重定向到登录页面。

import { Navigate } from 'react-router-dom';const ProtectedRoute = ({ children }) => {const isAuthenticated = false; // 认证逻辑return isAuthenticated ? children : <Navigate to="/login" />;
};<Routes><Route path="/profile" element={<ProtectedRoute><Profile /></ProtectedRoute>} />
</Routes>
4. 动态加载组件(代码分割)

React Router 可以与 React.lazy()Suspense 一起使用,按需加载组件。

import React, { Suspense, lazy } from 'react';
import { Routes, Route } from 'react-router-dom';const LazyHome = lazy(() => import('./Home'));function App() {return (<Routes><Route path="/" element={<Suspense fallback={<div>Loading...</div>}><LazyHome /></Suspense>} /></Routes>);
}
5. 查询参数

React Router 提供了获取 URL 查询参数的功能,可以通过 useSearchParams 钩子来处理。

import { useSearchParams } from 'react-router-dom';const SearchPage = () => {const [searchParams, setSearchParams] = useSearchParams();const query = searchParams.get('q');  // 获取查询参数return <div>Search query: {query}</div>;
};

5.React Router 配置示例

简单路由配置(React Router v6)
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';const Home = () => <h1>Home Page</h1>;
const About = () => <h1>About Page</h1>;function App() {return (<Router><Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /></Routes></Router>);
}
动态路由配置
import { BrowserRouter as Router, Routes, Route, useParams } from 'react-router-dom';const Post = () => {const { id } = useParams();  // 获取动态路由参数return <h2>Post {id}</h2>;
};function App() {return (<Router><Routes><Route path="/post/:id" element={<Post />} /></Routes></Router>);
}

6. 常用的 React Router 功能实战

3.1 基本用法
import React from 'react';
import { BrowserRouter as Router, Route, Link, Switch } from 'react-router-dom';const Home = () => <div>Home</div>;
const About = () => <div>About</div>;function App() {return (<Router><nav><Link to="/">Home</Link><Link to="/about">About</Link></nav><Switch><Route exact path="/" component={Home} /><Route path="/about" component={About} /></Switch></Router>);
}export default App;
3.2 动态路由
import React from 'react';
import { BrowserRouter as Router, Route, Link, useParams } from 'react-router-dom';const Post = () => {const { id } = useParams(); // 获取动态路由的参数return <div>Post ID: {id}</div>;
};function App() {return (<Router><nav><Link to="/post/1">Post 1</Link><Link to="/post/2">Post 2</Link></nav><Route path="/post/:id" component={Post} /></Router>);
}export default App;
3.3 编程式导航 (React Router v6)
import React from 'react';
import { useNavigate } from 'react-router-dom';const Home = () => {const navigate = useNavigate();const handleClick = () => {navigate('/about');};return (<div><h1>Home</h1><button onClick={handleClick}>Go to About</button></div>);
};export default Home;
3.4 嵌套路由
import React from 'react';
import { BrowserRouter as Router, Route, Link, Outlet } from 'react-router-dom';const Dashboard = () => (<div><h2>Dashboard</h2><nav><Link to="settings">Settings</Link></nav><Outlet /> {/* 渲染嵌套路由的占位符 */}</div>
);const Settings = () => <div>Settings Page</div>;function App() {return (<Router><Route path="dashboard" element={<Dashboard />}><Route path="settings" element={<Settings />} /></Route></Router>);
}export default App;

7. 高级用法实战

4.1 路由重定向
  • Redirect(v5)/ Navigate(v6)

v5

import { Redirect } from 'react-router-dom';// 重定向到首页
<Route path="/old-path"><Redirect to="/" />
</Route>

v6

import { Navigate } from 'react-router-dom';<Route path="/old-path" element={<Navigate to="/" />} />
4.2 路由守卫(保护路由)

React Router 本身不提供守卫功能,但可以通过编程方式进行实现,例如根据用户的认证状态来决定是否跳转到登录页。

import { Navigate } from 'react-router-dom';const ProtectedRoute = ({ element, ...rest }) => {const isAuthenticated = false; // 用户是否认证return isAuthenticated ? element : <Navigate to="/login" />;
};// 使用
<Route path="/profile" element={<ProtectedRoute element={<Profile />} />} />
4.3 通过 useLocation 获取当前 URL
import { useLocation } from 'react-router-dom';const CurrentLocation = () => {const location = useLocation();return <div>Current URL: {location.pathname}</div>;
};
4.4 动态加载组件

通过 React.lazySuspense 实现按需加载。

import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';const LazyHome = lazy(() => import('./Home'));function App() {return (<Router><Suspense fallback={<div>Loading...</div>}><Route path="/" component={LazyHome} /></Suspense></Router>);
}

8. React Router 底层核心原理

8.1 核心原理

  • 路由监听: 通过 window.historywindow.location.hash 监听 URL 的变化。
  • 匹配规则: 使用 path-to-regexp 库将路径转换为正则表达式,匹配当前 URL。
  • 渲染更新: 匹配的路由组件通过 React 的状态更新机制触发重新渲染。

8.2 关键步骤

  1. 路由定义时,存储路径与组件的映射关系。
  2. URL 变化时,根据路径规则找到对应组件。
  3. 使用 React 渲染匹配的组件。

React Router 底层的核心原理围绕着以下几个关键点:

  • 路由匹配:通过 URL 路径与路由配置进行匹配,决定渲染哪个组件。
  • history API:通过监听浏览器的历史记录来管理路由变化。
  • 虚拟 DOM 更新:通过 React 的更新机制,在路由变化时高效

地更新组件。

  • 嵌套路由:通过 Outlet 组件来支持父子路由的嵌套渲染。
  • 优化渲染:只重新渲染需要更新的组件,提升性能。

理解这些底层原理,能够帮助你更好地使用 React Router,并且在遇到复杂路由需求时,能够更灵活地调整和优化路由配置。

总结

React Router 是构建 React 应用的路由管理工具,具有强大的功能,如支持动态路由、嵌套路由、导航守卫、代码分割等。理解其核心概念及高级用法,可以帮助开发者更高效地构建和维护复杂的 React 应用。

相关文章:

前端React Router从入门到进阶实战

React Router 是 React 应用中的一个重要库&#xff0c;它用于实现客户端的路由管理&#xff0c;能够将 URL 路径与 React 组件关联起来&#xff0c;从而实现页面之间的导航。React Router 不会像传统的多页面应用那样重新加载页面&#xff0c;而是通过组件切换来呈现不同的视图…...

关于华硕Armoury Crate(奥创中心)安装程序失败、卡进度条问题解决方案

关于华硕Armoury Crate(奥创中心&#xff09;安装失败解决方案 清理旧版本文件 如果之前安装过Armoury Crate&#xff0c;可能有残留文件导致冲突&#xff1a; 利用官方的卸载工具&#xff0c;卸载旧版本&#xff1a; https://www.asus.com.cn/supportonly/armoury%20crate/…...

【WPF】 数据绑定机制之INotifyPropertyChanged

INotifyPropertyChanged 是 WPF 中的一个接口&#xff0c;用于实现 数据绑定 中的 属性更改通知。它的主要作用是&#xff0c;当对象的某个属性值发生更改时&#xff0c;通知绑定到该属性的 UI 控件更新其显示内容。 以下是有关 INotifyPropertyChanged 的详细信息和实现方法&…...

QPushButton的基础用法

概述 本文将详细介绍 QPushButton 的概念、常规用法、样式表以及一些特殊用法&#xff0c;帮助您深入理解和高效应用 QPushButton。当前Qt版本为6.8。 1. QPushButton 的基本概念 1.1 概述 QPushButton 是 Qt 中最常用的按钮控件之一&#xff0c;它表示一个可以被点击的按钮…...

股指期货有哪些优势?

股指期货&#xff0c;作为一种重要的金融衍生品&#xff0c;以其独特的交易方式和多样的优势&#xff0c;吸引了众多投资者的关注。本文将详细解析股指期货的定义、优势以及特点&#xff0c;帮助投资者更好地理解和把握这一市场。 一、股指期货的定义 股指期货&#xff0c;顾…...

STM32完全学习——FATFS0.15移植SD卡

一、下载FATFS源码 大家都知道使用CubMAX可以很快的将&#xff0c;FATFS文件管理系统移植到单片机上&#xff0c;但是别的芯片没有这么好用的工具&#xff0c;就需要自己从官网下载源码进行移植。我们首先解决SD卡的驱动问题&#xff0c;然后再移植FATFS文件管理系统。 二、SD…...

使用 Spring 状态机构建灵活的状态管理系统

引言 在软件开发中&#xff0c;状态机是一种非常重要的工具&#xff0c;尤其适用于需要处理复杂状态转换的场景。无论是订单管理系统中的订单状态、工作流引擎中的任务流转&#xff0c;还是审批流程的管理&#xff0c;状态机都能有效地帮助我们组织和管理不同的状态及其之间的…...

[SMARTFORMS] 添加设置图标

本地图片存放位置 使用事务码SE78进入表格图形管理页面&#xff0c;将导入图标到SAP系统 选择需要上传的图片地址&#xff0c;输入名称&#xff0c;描述和图片类型&#xff0c;点击导入按钮 完成上述操作以后&#xff0c;图标已导入到SAP系统中 提示Tips&#xff1a;如何将图标…...

网络世界的“交通规则”——TCP/IP(一)

一、非可靠传输的协议——UDP 1.1 UDP的报文格式 &#xff08;1&#xff09;UDP长度&#xff1a;表示整个UDP数据包的长度&#xff08;报头载荷&#xff09;&#xff1b; &#xff08;2&#xff09;校验和&#xff1a;用于验证UDP数据包在传输过程中有没发生比特翻转&#xff…...

Excel中公式和函数的区别

Excel中公式和函数的区别 概念讲解例子公式函数 详细介绍函数面板最后再次进行演示操作文档 概念讲解 公式是用户自己编写的表达式&#xff0c;而函数是由Excel预定义的操作。公式可以包含各种数学运算符和逻辑表达式&#xff0c;函数则是执行特定任务的工具。公式可以引用其他…...

Node.js应用程序遇到了内存溢出的问题

vue 项目 跑起来&#xff0c;一直报错&#xff0c;内存溢出 在 文件node_modules 里 .bin > vue-cli-service.cmd 在依赖包这个文件第一行加上这个 node --max-old-space-size102400 "%~dp0\..\vue\cli-service\bin\vue-cli-service.js" %* node --max-old-s…...

MySQL关联关系理论与实践

MySQL 是一种关系型数据库管理系统&#xff0c;以其高性能、灵活性和易用性在开发者中广受欢迎。在 MySQL 中&#xff0c;数据存储以表格形式存在&#xff0c;表与表之间的关联关系构成了关系型数据库的核心。本篇文章将介绍 MySQL 关联关系的理论基础和常见实践&#xff0c;包…...

w138基于Spring Boot的宠物领养系统的设计与实现

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…...

AMBA-CHI协议详解(十三)

AMBA-CHI协议详解&#xff08;一&#xff09;- Introduction AMBA-CHI协议详解&#xff08;二&#xff09;- Channel fields / Read transactions AMBA-CHI协议详解&#xff08;三&#xff09;- Write transactions AMBA-CHI协议详解&#xff08;四&#xff09;- Other transac…...

组合的能力

在《德鲁克最后的忠告》一书中&#xff0c;有这样一段话&#xff1a; 企业将由各种积木组建而成&#xff1a;人员、产品、理念和建筑。积木的设计组合至少和其供给一样重要。……对于一切程序、应用软件以及附件来说&#xff0c;重要的是掌握将已有的软件模块组合的能力&…...

若依使用 Undertow 替代 Tomcat 容器

文章目录 需求提出应用场景解决思路注意事项完整代码第一步&#xff1a;在 ruoyi-framework/pom.xml 文件中进行依赖配置第二步&#xff1a;修改 application.yml 配置文件第三步&#xff1a;修改文件上传工具类 FileUploadUtils.java 运行结果 需求提出 在开发若依框架的前后…...

STC单片机 IAP在线升级功能的使用介绍

STC单片机 IAP在线升级功能的使用介绍 从官方给出的IAP在线升级的demo示例来看&#xff0c;目前支持的型号有STC8、STC12、STC15、STC32&#xff0c;前提是需要使用64K/128K容量的型号。只支持用户程序容量小于60K 的项目。 &#x1f33f;IAP在线升级方式支持&#xff1a;CAN、…...

visio 0xC004F017

1.好久没用的电脑突然显示Office tool plus 的软件(visio)失效了 显示错误代码&#xff1a; 0xC004F017 2.在软件中重新配置 关键&#xff1a;KMS用了 kms.03k.org 3.在软件中重新配置 许可选择 4.一些额外的检查方法 打开控制台输入 slmgr /dlv 中间过程 还遇到过【错误…...

IoC设计模式详解:控制反转的核心思想

前言&#xff1a;在软件开发中&#xff0c;设计模式是一种经过验证的、在特定场景下能有效解决问题的解决方案。控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09; 作为一种设计模式&#xff0c;通过让程序的控制流和对象管理反转&#xff0c;从而使得代码…...

C语言延时实现

C语言延时实现 在C语言中&#xff0c;delay 函数通过空循环实现延时&#xff0c;而不是像其他高级语言&#xff08;如Python&#xff09;直接使用 sleep 函数。这种实现方式是基于单片机的特性和C语言的底层操作。下面详细解释为什么这种空循环可以实现延时&#xff0c;以及它…...

CDP集群安全指南-静态数据加密

[一]静态数据加密的架构 CDP 支持两种加密组件&#xff0c;这些组件可以组合成独特的解决方案。在选择密钥管理系统&#xff08;KMS&#xff09;时&#xff0c;您需要决定哪些组件能够满足企业的密钥管理和加密需求。 CDP 加密组件 以下是 Cloudera 用于静态数据加密的组件描…...

# LeetCode Problem 2038: 如果相邻两个颜色均相同则删除当前颜色 (Winner of the Game)

LeetCode Problem 2038: 如果相邻两个颜色均相同则删除当前颜色 (Winner of the Game) 在本篇博客中&#xff0c;我们将深入探讨 LeetCode 第2038题——如果相邻两个颜色均相同则删除当前颜色。该问题涉及字符串处理与游戏策略&#xff0c;旨在考察如何在给定规则下判断游戏的…...

极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现

极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现 目录 极限学习机 (Extreme Learning Machine, ELM) 算法详解与PyTorch实现1. 极限学习机 (ELM) 算法概述1.1 单隐层前馈神经网络1.2 ELM的优势2. ELM的核心技术2.1 模型定义2.2 随机初始化2.3 最小二乘法2.4…...

【insert 插入数据语法合集】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录一、前言 &#x1f343;二、插入方式 &#x1f4af;2.1 单条插入实体2.2 批量 插入实体2.3 根据字典插入2.4 根据 Dat…...

什么是.net framework,什么是.net core,什么是.net5~8,版本对应关系

我不知道有多少人和我一样&#xff0c;没学习过.netCore&#xff0c;想要学习&#xff0c;但是版本号太多就蒙了&#xff0c;不知道学什么了&#xff0c;这里解释下各个版本的关系 我们一般开始学习微软的时候&#xff0c;都是开始学习的.netframework&#xff0c;常用的就是4…...

【数据库系统概论】数据库安全性和存取控制和视图机制以及审计、数据加密--复习极简总结版

1. 数据库安全性概述 1.1 数据库安全性的重要性 数据库安全性是保护数据库防止非法访问、数据泄露、篡改或破坏的能力。它随着数据共享和网络化应用的普及而变得至关重要。现实案例&#xff1a; 2016年&#xff0c;某国医院遭受黑客攻击&#xff0c;黑客加密数据库并勒索赎金…...

深入理解计算机系统—虚拟内存(3)

9.9 动态内存分配 虽然可以使用低级的 mmap 和 munmap 函数来创建和删除虚拟内存的区域&#xff0c;但是 C程序员还是会觉得当运行时需要额外虚拟内存时&#xff0c;用 动态内存分配器 更方便&#xff0c;也有更好的可移植性。 动态内存分配器维护着一个进程的虚拟内存区域&…...

Vue项目整合与优化

前几篇文章&#xff0c;我们讲述了 Vue 项目构建的整体流程&#xff0c;从无到有的实现了单页和多页应用的功能配置&#xff0c;但在实现的过程中不乏一些可以整合的功能点及可行性的优化方案&#xff0c;就像大楼造完需要进行最后的项目验收改进一样&#xff0c;有待我们进一步…...

MyBatis 与 MyBatis-Plus 的区别

MyBatis 和 MyBatis-Plus 都是用于简化 Java 应用程序与数据库交互的持久层框架&#xff0c;但它们在功能、易用性和性能优化方面存在显著差异。下面将详细介绍两者之间的区别&#xff0c;并通过具体的代码示例进行对比。 概述 MyBatis&#xff1a;作为一款经典的持久层框架&a…...

如何让大模型不再“已读乱回”——RAG技术助力生成更精确的答案

随着大语言模型&#xff08;LLM&#xff09; 的迅猛发展&#xff0c;越来越多的领域开始受益于其强大的自然语言处理能力。从写作到编程&#xff0c;LLM已成为我们日常生活和工作的得力助手。然而&#xff0c;这些看似无所不能的大模型&#xff0c;却有一个致命的弱点&#xff…...

Anaconda环境配置(Windows11+python3.9)

文章目录 一、 下载ANACONDA&#xff08;1&#xff09;点击**Free Download**。&#xff08;2&#xff09;点击“skip registration”&#xff0c;跳过登录。&#xff08;3&#xff09;下载对应操作系统的ANACONDA版本。 二、 安装ANACONDA&#xff08;1&#xff09;双击运行安…...

Spring Boot 中的虚拟线程

什么是虚拟线程&#xff1f; 虚拟线程&#xff08;Virtual Threads&#xff09;是 Java 19 引入的一项新特性&#xff0c;它属于 Project Loom 项目的一部分。与传统的线程&#xff08;平台线程&#xff09;不同&#xff0c;虚拟线程并不是由操作系统直接管理&#xff0c;而是…...

el-table 实现纵向多级表头

为了实现上图效果&#xff0c;最开始打算用el-row、el-col去实现&#xff0c;但发现把表头和数据分成两大列时&#xff0c;数据太多时会导致所在格高度变高。但由于每一格数据肯定不一样&#xff0c;为保持高度样式一致&#xff0c;就需要我们手动去获取最高格的高度之后再设置…...

探秘Kafka源码:关键内容解析

文章目录 一、以kafka-3.0.0为例1.1安装 gradle 二、生产者源码2.1源码主流程图2.2 初始化2.3生产者sender线程初始化2.4 程序入口2.5生产者 main 线程初始化2.6 跳转到 KafkaProducer构造方法 一、以kafka-3.0.0为例 打开 IDEA&#xff0c;点击 File->Open…->源码包解…...

Promise编码小挑战

题目 我们将实现一个 createImage 函数&#xff0c;该函数返回一个 Promise&#xff0c;用于处理图片加载的异步操作。此外&#xff0c;还会实现暂停执行的 wait 函数。 Part 1: createImage 函数 该函数会&#xff1a; 创建一个新的图片元素。将图片的 src 设置为提供的路径…...

PyQt实战——将pcm文本数据转换成.pcm的二进制文件

系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序入口QMainWindow&#xff08;三&…...

数据结构之线性表

1.什么是线性表 线性表的概念 定义&#xff1a;线性表是由n个数据元素组成的有限序列。每个数据元素&#xff08;除了第一个和最后一个&#xff09;都有且仅有一个前驱和一个后继。逻辑结构&#xff1a;线性表的逻辑结构可以用一个序列来表示&#xff0c;例如 L(a1,a2,…,an)。…...

量子行走的干涉性和叠加性

需要注意公式的一些特殊情况&#xff0c;举例&#xff0c;当dj2和dj3 dj2 dj3...

Fabric环境部署-安装Go

安装go语言环境 国内镜像&#xff1a;Go下载 - Go语言中文网 - Golang中文社区 1.选择版本下载后解压&#xff1a;注意go1.11.linux-amd64.tar.gz换成你下的 sudo tar zxvf go1.21.linux-amd64.tar.gz -C /usr/local 2.. 创建Go目录 mkdir $HOME/go 3. 用vi打开~./bashrc&…...

网站设计总结后期维护与更新的重要性

当我们谈论网站设计时&#xff0c;往往会聚焦在初始阶段的创意和实现上。然而&#xff0c;一旦网站建成并上线&#xff0c;后期维护与更新的重要性就显得尤为突出。一个网站的成功不仅取决于其初始设计&#xff0c;更在于持续的维护与更新。 首先&#xff0c;后期维护能够确保网…...

『SQLite』详解运算符

内容摘要&#xff1a;本节讲解运算符&#xff0c;包括&#xff1a;算术运算符、比较运算符、逻辑运算符和位运算符。 什么是运算符&#xff1f; 运算符是一个保留字或字符&#xff0c;主要用于 SQLite 语句的 WHERE 子句中执行操作。它用于指定 SQLite 语句中的条件&#xff0…...

计算机网络--根据IP地址和路由表计算下一跳

一、必备知识 1.无分类地址IPV4地址网络前缀主机号 2.每个IPV4地址由32位二进制数组成 3. /15这个地址表示网络前缀有15位&#xff0c;那么主机号32-1517位。 4.地址掩码&#xff08;子网掩码&#xff09;&#xff1a;所对应的网络前缀为1&#xff0c;主机号为0。 5.计算下…...

如何使用 Ansys OptiSlang 同时运行多个参数化设计研究

了解如何通过使用 OptiSLang 同时运行多个参数化设计研究来提高工作效率。 了解参数化设计研究的重要性 参数化设计研究在工程和设计过程中起着至关重要的作用。通过改变输入参数&#xff0c;工程师可以探索不同设计选择的效果&#xff0c;并优化其设计以满足性能、成本或其他…...

《 拼数 》

题目描述 设有 nn 个正整数 a1…ana1​…an​&#xff0c;将它们联接成一排&#xff0c;相邻数字首尾相接&#xff0c;组成一个最大的整数。 输入格式 第一行有一个整数&#xff0c;表示数字个数 nn。 第二行有 nn 个整数&#xff0c;表示给出的 nn 个整数 aiai​。 输出格…...

Memcached CAS 命令

Memcached CAS&#xff08;Check-And-Set 或 Compare-And-Swap&#xff09; 命令用于执行一个"检查并设置"的操作 它仅在当前客户端最后一次取值后&#xff0c;该key 对应的值没有被其他客户端修改的情况下&#xff0c; 才能够将值写入。 检查是通过cas_token参数进…...

ElasticSearch基础-文章目录

ElasticSearch学习总结1&#xff08;环境安装&#xff09; ElasticSearch学习总结2&#xff08;基础查询&#xff09; ElasticSearch学习总结3&#xff08;.NetCore操作ES&#xff09; ElasticSearch学习总结4&#xff08;sql操作ES&#xff09; ElasticSearch学习总结5&am…...

后台管理系统动态面包屑Breadcrumb组件的实现

在后管理系统开发中&#xff0c;面包屑导航是一个非常常见的功能&#xff0c;通常是根据当前的 url 自动生成面包屑导航菜单&#xff0c;当跳转路由发生变化时&#xff0c;面包屑导航都会随之发生变化&#xff0c;即动态面包屑。 要完成动态面包屑我们需要制作一个动态数组&am…...

java项目之校园管理系统的设计与实现(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; springboot校园…...

浅谈棋牌游戏开发流程八:运维与数据分析

一、前言&#xff1a;为什么“云端运维”和“数据分析”如此重要&#xff1f; 在前面几篇文章中&#xff0c;我们已经从客户端、后端架构、用户系统、房间匹配与对局流程、数据库设计与优化、支付与充值、安全与反外挂等角度&#xff0c;系统性地搭建了一个棋牌游戏的基本框架…...

uniapp:微信小程序文本长按无法出现复制菜单

一、问题描述 在集成腾讯TUI后&#xff0c;为了能让聊天文本可以复制&#xff0c;对消息组件的样式进行修改&#xff0c;主要是移除下面的user-select属性限制&#xff1a; user-select: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms…...