React Router常见面试题目
1. React Router 支持哪几种模式?
React Router 支持以下两种主要模式:
-
BrowserRouter (基于 HTML5 History API 的模式)
- 原理:
- 利用
history.pushState
和history.replaceState
操作浏览器历史栈,无需重新加载页面。 - URL 看起来像传统 URL,如
/home
。
- 利用
- 优点:
- URL 结构简洁美观。
- SEO 友好。
- 缺点:
- 需要服务器配置支持,否则刷新页面时会导致 404。
- 原理:
-
HashRouter (基于 URL 哈希的模式)
- 原理:
- URL 中的
#
和其后内容不会被发送到服务器,浏览器通过window.location.hash
检测路由变化。 - 示例 URL:
/index.html#/home
。
- URL 中的
- 优点:
- 不需要服务器配置,支持直接在本地文件系统中打开。
- 缺点:
- URL 不够美观,不适合 SEO。
- 原理:
2. React Router 中的 Router 组件有几种类型?
常见的 Router 组件类型:
- BrowserRouter
使用 HTML5history
模式,提供更清晰的 URL。 - HashRouter
使用哈希模式,适用于不需要服务器支持的项目。 - MemoryRouter
存储在内存中的路由,不与浏览器地址栏同步,适用于测试环境。 - StaticRouter
用于服务器端渲染 (SSR),路由配置是静态的。 - NativeRouter
React Native 使用的路由组件。
3. 在 React Router 的 history 模式中,push 和 replace 方法有什么区别?
-
push 方法:
- 在浏览器历史记录栈中添加一个新条目。
- 用户可以通过浏览器的后退按钮返回到之前的页面。
- 示例:
import { useHistory } from 'react-router-dom'; const history = useHistory(); history.push('/new-route');
-
replace 方法:
- 替换当前历史记录栈中的条目。
- 不会新增历史记录,后退按钮无法返回到之前的页面。
- 示例:
import { useHistory } from 'react-router-dom'; const history = useHistory(); history.replace('/new-route');
4. React Router 中的 Switch 有什么作用?
- 作用:
Switch
用于确保只有第一个匹配的路由会被渲染。 - 原理:
遍历Switch
内的子Route
,找到第一个path
匹配的Route
并渲染,忽略后续路由。 - 示例:
import { Switch, Route } from 'react-router-dom'; <Switch><Route path="/home" component={Home} /><Route path="/about" component={About} /><Route component={NotFound} /> {/* 兜底处理 */} </Switch>
- 好处:
避免多个路由同时渲染,提高路由匹配效率。
5. React Router 支持的路由模式有哪些?
React Router 支持的模式:
- HTML5
history
模式(BrowserRouter
)。 - 哈希模式(
HashRouter
)。 - 内存模式(
MemoryRouter
,通常用于测试或无浏览器环境)。
6. 什么是 React Router ? 常用的 Router 组件有哪些?
- React Router 是一个路由库,用于在 React 应用中实现单页面应用(SPA)的路由功能。
- 常用的 Router 组件:
BrowserRouter
HashRouter
MemoryRouter
StaticRouter
NativeRouter
(React Native)
7. React Router 的路由是什么?它和普通路由有什么区别?有什么优缺点?
-
React Router 的路由:
- React Router 的路由是组件化的,通过
Route
组件定义路径和对应的组件。 - 示例:
import { BrowserRouter as Router, Route } from 'react-router-dom'; <Router><Route path="/home" component={Home} /> </Router>
- React Router 的路由是组件化的,通过
-
区别:
特性 React Router 路由 普通路由 更新机制 单页面应用,组件重新渲染 整个页面重新加载 URL 样式 可定制 URL 静态路径或文件映射 用户体验 快速切换,无刷新 切换时刷新页面,速度较慢 -
优点:
- 用户体验好,页面切换快速。
- 易于动态加载组件,实现按需加载。
- 路由配置灵活,适合复杂应用。
-
缺点:
- SEO 支持需要额外配置(如 SSR)。
- URL 和组件的关联需要开发者手动维护。
8. 如何在 React 路由中实现动态加载模块,以实现按需加载?
可以使用 React 的 lazy
和 Suspense
组件来实现按需加载:
import React, { lazy, Suspense } from 'react';
import { BrowserRouter as Router, Route } from 'react-router-dom';const Home = lazy(() => import('./Home'));
const About = lazy(() => import('./About'));function App() {return (<Router><Suspense fallback={<div>Loading...</div>}><Route path="/home" component={Home} /><Route path="/about" component={About} /></Suspense></Router>);
}
- 原理:
- 当路由匹配时,组件才会动态加载。
- 提高初始页面加载速度,减少不必要的资源加载。
9. React Router 的路由变化时,如何重新渲染同一个组件?
当路由变化但仍在同一组件时,可以使用以下方法触发重新渲染:
- 使用
useEffect
监听路由参数变化:import { useParams } from 'react-router-dom'; import { useEffect } from 'react';function MyComponent() {const { id } = useParams();useEffect(() => {console.log(`Route parameter changed: ${id}`);}, [id]);return <div>Current ID: {id}</div>; }
- 强制更新组件:
如果路由参数未变化但需要强制刷新,可以使用key
属性:import { useLocation } from 'react-router-dom';function MyComponent() {const location = useLocation();return <div key={location.pathname}>My Component</div>; }
以上是关于 React Router 的详细解答与示例,希望能帮助你更好地理解和应用它!
1. 如何在 React Router 中设置重定向?
在 React Router 中,可以通过以下两种方式实现重定向:
1.1 使用 <Navigate>
组件
在 React Router v6 中,使用 <Navigate>
组件来重定向:
import { Navigate } from 'react-router-dom';function App() {return (<Routes><Route path="/home" element={<Home />} /><Route path="/" element={<Navigate to="/home" />} /></Routes>);
}
1.2 使用 useNavigate
Hook
通过 useNavigate
手动触发重定向:
import { useNavigate } from 'react-router-dom';function Login() {const navigate = useNavigate();const handleLogin = () => {// 登录逻辑navigate('/dashboard');};return <button onClick={handleLogin}>Login</button>;
}
2. 在 React Router 中如何获取 URL 参数?
2.1 使用 useParams
Hook
useParams
是 React Router 提供的 Hook,用于获取动态路由参数:
import { useParams } from 'react-router-dom';function UserDetail() {const { userId } = useParams();return <div>User ID: {userId}</div>;
}
2.2 示例路由
<Routes><Route path="/user/:userId" element={<UserDetail />} />
</Routes>
访问 /user/123
会显示 User ID: 123
。
3. 如何配置 React Router 实现路由切换?
3.1 配置路由
使用 Routes
和 Route
配置路由:
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';function App() {return (<Router><Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /></Routes></Router>);
}
3.2 路由切换
使用 <Link>
或 <NavLink>
组件触发切换:
import { Link } from 'react-router-dom';function Navbar() {return (<nav><Link to="/">Home</Link><Link to="/about">About</Link></nav>);
}
4. React Router 4 和 React Router 3 有哪些变化?新增了哪些特性?
4.1 主要变化
-
组件化设计:
- React Router 4 使用完全组件化的设计,每个路由都是一个组件。
- React Router 3 使用集中式配置方式。
-
嵌套路由的实现:
- React Router 4:嵌套路由通过组件嵌套实现。
- React Router 3:嵌套路由通过静态配置实现。
-
Switch
组件:- React Router 4 引入了
<Switch>
,用于匹配第一个符合条件的路由。
- React Router 4 引入了
-
动态路由加载:
- React Router 4 支持动态导入组件,优化加载性能。
4.2 示例对比
React Router 3 配置路由:
import { Router, Route, browserHistory } from 'react-router';<Router history={browserHistory}><Route path="/" component={App}><Route path="about" component={About} /></Route>
</Router>;
React Router 4 配置路由:
<BrowserRouter><Routes><Route path="/" element={<App />} /><Route path="/about" element={<About />} /></Routes>
</BrowserRouter>;
5. 在 React Router 中如何获取历史对象?
5.1 使用 useNavigate
Hook
React Router v6 提供 useNavigate
代替 history
:
import { useNavigate } from 'react-router-dom';function Component() {const navigate = useNavigate();const goBack = () => navigate(-1);return <button onClick={goBack}>Go Back</button>;
}
5.2 v5 及更早版本的 history
早期版本使用 useHistory
获取 history
对象:
import { useHistory } from 'react-router-dom';function Component() {const history = useHistory();history.push('/home');
}
6. React Router 的实现原理是什么?
React Router 的核心是监听 URL 变化,并根据匹配规则动态渲染对应的组件。
6.1 核心原理
- 路由监听:
通过window.history
或window.location.hash
监听 URL 的变化。 - 匹配规则:
使用path-to-regexp
库将路径转换为正则表达式,匹配当前 URL。 - 渲染更新:
匹配的路由组件通过 React 的状态更新机制触发重新渲染。
6.2 关键步骤
- 路由定义时,存储路径与组件的映射关系。
- URL 变化时,根据路径规则找到对应组件。
- 使用 React 渲染匹配的组件。
7. React 路由切换时,如果同一组件无法重新渲染,有哪些方法可以解决?
7.1 监听参数变化
使用 useEffect
或 componentDidUpdate
监听参数变化:
import { useParams } from 'react-router-dom';function Component() {const { id } = useParams();useEffect(() => {console.log(`Route parameter changed: ${id}`);}, [id]);return <div>Current ID: {id}</div>;
}
7.2 强制重新渲染
通过更改组件的 key
强制重新渲染:
import { useLocation } from 'react-router-dom';function Component() {const location = useLocation();return <div key={location.pathname}>My Component</div>;
}
7.3 手动清理状态
在参数变化时清理状态,触发组件重新渲染:
useEffect(() => {setState(null); // 清理状态
}, [id]);
8. React Router 中的 Link 标签和 HTML 的 a 标签有什么区别?
8.1 区别
特性 | <Link> | <a> |
---|---|---|
页面刷新 | 不刷新页面 | 刷新页面 |
性能 | 单页面跳转,速度更快 | 每次跳转都重新加载资源 |
路由支持 | 集成 React Router 路由 | 不支持 |
SEO 支持 | 同样支持 | 支持 |
8.2 示例对比
使用 <a>
标签:
<a href="/about">About</a>
每次点击都会刷新页面。
使用 <Link>
标签:
import { Link } from 'react-router-dom';<Link to="/about">About</Link>
点击不会刷新页面,仅更新路由。
以上是关于 React Router 各个问题的详细解答及代码示例,希望能够帮助你深入理解和应用 React Router!
相关文章:
React Router常见面试题目
1. React Router 支持哪几种模式? React Router 支持以下两种主要模式: BrowserRouter (基于 HTML5 History API 的模式) 原理: 利用 history.pushState 和 history.replaceState 操作浏览器历史栈,无需重新加载页面。URL 看起来像传统 URL…...
sequelize-cli 封装登录接口
node ORM (sequelize)使用、查询、验证及express 基础框架的搭建及实例的使用 一、思路 第一步:肯定是用户要向接口传递邮箱、账号和密码了。 第二步:接口这边,先要验证。因为这里不是往数据库里存储数据,…...
使用 Elasticsearch 查询和数据同步的实现方法
在开发过程中,将数据从数据库同步到 Elasticsearch (ES) 是常见的需求之一。本文将重点介绍如何通过 Python 脚本将数据库中的数据插入或更新到 Elasticsearch,并基于多字段的唯一性来判断是否执行插入或更新操作。此外,我们还将深入探讨如何…...

QTday1作业设置简易登录界面
代码 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//创建一个标签QLabel *lab1 new QLabel(this);//重新设置大小lab1->resize(1925,1080);//用动图类QMovie实例化一个动图QMovie *mv new QMovie("C:\\Users\\MR\\Deskto…...

RC低通滤波器和LR低通滤波器,LC低通滤波器该怎么选择
这是RC低通滤波器利用电容两端的电压不能突变可以滤除高频噪声 这是LR低通滤波器利用流过电感的电流不能突变也可以滤除高频噪声 那么问题来了两个低通滤波器,该怎么选择呢还是随便选一个就好? RC电路:因为电流电阻会发热耗能,所…...
芯旺微KF32A156芯片ADC配置
使用芯旺微KF32A156的芯片做预研项目,使用了ADC0外设,根据芯片规格书中的描述进行了配置: /*** brief: Configure ADC.** param[in] none.* param[in] none.* param[out] None* retval: None*/ static void adc_peripheral_init(void) …...

【Token】校验、会话技术、登录请求、拦截器【期末实训】实战项目学生和班级管理系统\Day15-后端Web实战(登录认证)\讲义
登录认证 在前面的课程中,我们已经实现了部门管理、员工管理的基本功能,但是大家会发现,我们并没有登录,就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的,所以我们今天的主题就是登录认证。 最终我们要实现…...
[Unity Shader] 【游戏开发】【图形渲染】Shader数学基础3:矢量与标量的乘法与除法详解
在计算机图形学和Shader编程中,矢量(Vector)运算是非常基础的数学知识。其中,矢量与标量(Scalar)的乘法与除法是常见的操作。本篇文章将通过详细分析,以及实例讲解矢量和标量的乘除法运算,帮助大家更好地理解并应用到实际开发中。 什么是矢量与标量? 在开始具体运算之…...
javalock(四)AQS派生类之Semphore逐行注释
简单概括: Semphore是一把共享锁(即读锁),即实现了AQS的tryAcquireShared&&tryReleaseShared函数Semphore的逻辑是这样: 创建semphore的时候会初始化一个锁容量即permits,即最多同时允许permits个…...

【C语言】头文件”“和<>的详解
前言 作者在刚开始学C语言的时候,都是用的< >去引用头文件,但在学习STM32的时候发现,程序中大量使用" "去引用双引号。 那么二者有什么区别呢? 无论使用哪种方式,头文件的目的都是为了引用你需要的文件供你编程使…...

Elasticsearch:什么是信息检索?
信息检索定义 信息检索 (IR) 是一种有助于从大量非结构化或半结构化数据中有效、高效地检索相关信息的过程。信息(IR)检索系统有助于搜索、定位和呈现与用户的搜索查询或信息需求相匹配的信息。 作为信息访问的主要形式,信息检索是每天使用…...
Spark-Streaming容错语义
一、背景 为了理解Spark Streaming提供的语义,我们先回顾西Spark RDD的基本容错语义学。 RDD是一个不可变的、确定性可重新计算的分布式数据集。每个RDD都记住在容错输入数据集上用于创建它的确定性操作的沿袭。如果RDD的任何分区由于工作节点故障而丢失ÿ…...

2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程
2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程 产品介绍 仿东郊到家约玩系统是一种新兴的线上预约,线下社交、陪伴、助娱、助攻、分享、解答、指导等服务模式,范围涉及电竞、运动、音乐…...

GUI07-学工具栏,懂MVC
MVC模式,是天底下编写GUI程序最为经典、实效的一种软件架构模式。当一个人学完菜单栏、开始学习工具栏时,就是他的一生中,最适合开始认识 MVC 模式的好时机之一。这节将安排您学习: Model-View-Controller 模式如何创建工具栏以及…...

【进程篇】04.进程的状态与优先级
一、进程的状态 1.1 进程的状态 1.1.1 并行与并发 • 并行: 多个进程在多个CPU下分别,同时进行运行 • 并发: 多个进程在一个CPU下采用进程切换的方式,在一个时间片内,让多个进程都得以推进 1.1.2 时间片的概念 LInux/windows这些民用级别…...

ElasticSearch 数据聚合与运算
1、数据聚合 聚合(aggregations)可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多,而且查询速度非常快,可以实现近实时搜索效果。 注意: 参加聚合的字段必须是 keywor…...

科研学习|论文解读——智能体最新研究进展
从2024-12-13到2024-12-18的45篇文章中精选出5篇优秀的工作分享 Can Modern LLMs Act as Agent Cores in Radiology~Environments? Achieving Collective Welfare in Multi-Agent Reinforcement Learning via Suggestion Sharing A systematic review of norm emergence in …...
面试小札:Java后端闪电五连鞭_8
1. Kafka消息模型及其组成部分 - 消息(Message):是Kafka中最基本的数据单元。消息包含一个键(key)、一个值(value)和一个时间戳(timestamp)。键可以用于对消息进行分区等…...
java error(2)保存时间带时分秒,回显时分秒变成00:00:00
超简单,顺带记录一下 1.入参实体类上使用注释:JsonFormat(pattern “yyyy-MM-dd”) 导致舍弃了 时分秒的部分。 2.数据库字段对应的类型是 date。date就是日期,日期就不带时分秒。 3.返参实体类使用了JsonFormat(pattern “yyyy-MM-dd”) 导…...

计算机毕业设计python+spark+hive动漫推荐系统 漫画推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据毕设
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...