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

React Router常见面试题目

1. React Router 支持哪几种模式?

React Router 支持以下两种主要模式:

  1. BrowserRouter (基于 HTML5 History API 的模式)

    • 原理
      • 利用 history.pushStatehistory.replaceState 操作浏览器历史栈,无需重新加载页面。
      • URL 看起来像传统 URL,如 /home
    • 优点
      • URL 结构简洁美观。
      • SEO 友好。
    • 缺点
      • 需要服务器配置支持,否则刷新页面时会导致 404。
  2. HashRouter (基于 URL 哈希的模式)

    • 原理
      • URL 中的 # 和其后内容不会被发送到服务器,浏览器通过 window.location.hash 检测路由变化。
      • 示例 URL:/index.html#/home
    • 优点
      • 不需要服务器配置,支持直接在本地文件系统中打开。
    • 缺点
      • URL 不够美观,不适合 SEO。

2. React Router 中的 Router 组件有几种类型?

常见的 Router 组件类型:

  1. BrowserRouter
    使用 HTML5 history 模式,提供更清晰的 URL。
  2. HashRouter
    使用哈希模式,适用于不需要服务器支持的项目。
  3. MemoryRouter
    存储在内存中的路由,不与浏览器地址栏同步,适用于测试环境。
  4. StaticRouter
    用于服务器端渲染 (SSR),路由配置是静态的。
  5. 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 支持的模式:

  1. HTML5 history 模式(BrowserRouter)。
  2. 哈希模式(HashRouter)。
  3. 内存模式(MemoryRouter,通常用于测试或无浏览器环境)。

6. 什么是 React Router ? 常用的 Router 组件有哪些?

  • React Router 是一个路由库,用于在 React 应用中实现单页面应用(SPA)的路由功能。
  • 常用的 Router 组件
    1. BrowserRouter
    2. HashRouter
    3. MemoryRouter
    4. StaticRouter
    5. 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 路由普通路由
    更新机制单页面应用,组件重新渲染整个页面重新加载
    URL 样式可定制 URL静态路径或文件映射
    用户体验快速切换,无刷新切换时刷新页面,速度较慢
  • 优点

    1. 用户体验好,页面切换快速。
    2. 易于动态加载组件,实现按需加载。
    3. 路由配置灵活,适合复杂应用。
  • 缺点

    1. SEO 支持需要额外配置(如 SSR)。
    2. URL 和组件的关联需要开发者手动维护。

8. 如何在 React 路由中实现动态加载模块,以实现按需加载?

可以使用 React 的 lazySuspense 组件来实现按需加载:

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>);
}
  • 原理
    1. 当路由匹配时,组件才会动态加载。
    2. 提高初始页面加载速度,减少不必要的资源加载。

9. React Router 的路由变化时,如何重新渲染同一个组件?

当路由变化但仍在同一组件时,可以使用以下方法触发重新渲染:

  1. 使用 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>;
    }
    
  2. 强制更新组件
    如果路由参数未变化但需要强制刷新,可以使用 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 配置路由

使用 RoutesRoute 配置路由:

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 支持动态导入组件,优化加载性能。
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.historywindow.location.hash 监听 URL 的变化。
  • 匹配规则
    使用 path-to-regexp 库将路径转换为正则表达式,匹配当前 URL。
  • 渲染更新
    匹配的路由组件通过 React 的状态更新机制触发重新渲染。
6.2 关键步骤
  1. 路由定义时,存储路径与组件的映射关系。
  2. URL 变化时,根据路径规则找到对应组件。
  3. 使用 React 渲染匹配的组件。

7. React 路由切换时,如果同一组件无法重新渲染,有哪些方法可以解决?

7.1 监听参数变化

使用 useEffectcomponentDidUpdate 监听参数变化:

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 支持以下两种主要模式&#xff1a; BrowserRouter (基于 HTML5 History API 的模式) 原理&#xff1a; 利用 history.pushState 和 history.replaceState 操作浏览器历史栈&#xff0c;无需重新加载页面。URL 看起来像传统 URL…...

sequelize-cli 封装登录接口

node ORM &#xff08;sequelize&#xff09;使用、查询、验证及express 基础框架的搭建及实例的使用 一、思路 第一步&#xff1a;肯定是用户要向接口传递邮箱、账号和密码了。 第二步&#xff1a;接口这边&#xff0c;先要验证。因为这里不是往数据库里存储数据&#xff0c;…...

使用 Elasticsearch 查询和数据同步的实现方法

在开发过程中&#xff0c;将数据从数据库同步到 Elasticsearch (ES) 是常见的需求之一。本文将重点介绍如何通过 Python 脚本将数据库中的数据插入或更新到 Elasticsearch&#xff0c;并基于多字段的唯一性来判断是否执行插入或更新操作。此外&#xff0c;我们还将深入探讨如何…...

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低通滤波器利用流过电感的电流不能突变也可以滤除高频噪声 那么问题来了两个低通滤波器&#xff0c;该怎么选择呢还是随便选一个就好&#xff1f; RC电路&#xff1a;因为电流电阻会发热耗能&#xff0c;所…...

芯旺微KF32A156芯片ADC配置

使用芯旺微KF32A156的芯片做预研项目&#xff0c;使用了ADC0外设&#xff0c;根据芯片规格书中的描述进行了配置&#xff1a; /*** brief: Configure ADC.** param[in] none.* param[in] none.* param[out] None* retval: None*/ static void adc_peripheral_init(void) …...

【Token】校验、会话技术、登录请求、拦截器【期末实训】实战项目学生和班级管理系统\Day15-后端Web实战(登录认证)\讲义

登录认证 在前面的课程中&#xff0c;我们已经实现了部门管理、员工管理的基本功能&#xff0c;但是大家会发现&#xff0c;我们并没有登录&#xff0c;就直接访问到了Tlias智能学习辅助系统的后台。 这是不安全的&#xff0c;所以我们今天的主题就是登录认证。 最终我们要实现…...

[Unity Shader] 【游戏开发】【图形渲染】Shader数学基础3:矢量与标量的乘法与除法详解

在计算机图形学和Shader编程中,矢量(Vector)运算是非常基础的数学知识。其中,矢量与标量(Scalar)的乘法与除法是常见的操作。本篇文章将通过详细分析,以及实例讲解矢量和标量的乘除法运算,帮助大家更好地理解并应用到实际开发中。 什么是矢量与标量? 在开始具体运算之…...

javalock(四)AQS派生类之Semphore逐行注释

简单概括&#xff1a; Semphore是一把共享锁&#xff08;即读锁&#xff09;&#xff0c;即实现了AQS的tryAcquireShared&&tryReleaseShared函数Semphore的逻辑是这样&#xff1a; 创建semphore的时候会初始化一个锁容量即permits&#xff0c;即最多同时允许permits个…...

【C语言】头文件”“和<>的详解

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

Elasticsearch:什么是信息检索?

信息检索定义 信息检索 (IR) 是一种有助于从大量非结构化或半结构化数据中有效、高效地检索相关信息的过程。信息&#xff08;IR&#xff09;检索系统有助于搜索、定位和呈现与用户的搜索查询或信息需求相匹配的信息。 作为信息访问的主要形式&#xff0c;信息检索是每天使用…...

Spark-Streaming容错语义

一、背景 为了理解Spark Streaming提供的语义&#xff0c;我们先回顾西Spark RDD的基本容错语义学。 RDD是一个不可变的、确定性可重新计算的分布式数据集。每个RDD都记住在容错输入数据集上用于创建它的确定性操作的沿袭。如果RDD的任何分区由于工作节点故障而丢失&#xff…...

2024年12月陪玩系统-仿东郊到家约玩系统是一种新兴的线上预约线下社交、陪伴系统分享-优雅草央千澈-附带搭建教程

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

GUI07-学工具栏,懂MVC

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

【进程篇】04.进程的状态与优先级

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

ElasticSearch 数据聚合与运算

1、数据聚合 聚合&#xff08;aggregations&#xff09;可以让我们极其方便的实现数据的统计、分析和运算。实现这些统计功能的比数据库的 SQL 要方便的多&#xff0c;而且查询速度非常快&#xff0c;可以实现近实时搜索效果。 注意&#xff1a; 参加聚合的字段必须是 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消息模型及其组成部分 - 消息&#xff08;Message&#xff09;&#xff1a;是Kafka中最基本的数据单元。消息包含一个键&#xff08;key&#xff09;、一个值&#xff08;value&#xff09;和一个时间戳&#xff08;timestamp&#xff09;。键可以用于对消息进行分区等…...

java error(2)保存时间带时分秒,回显时分秒变成00:00:00

超简单&#xff0c;顺带记录一下 1.入参实体类上使用注释&#xff1a;JsonFormat(pattern “yyyy-MM-dd”) 导致舍弃了 时分秒的部分。 2.数据库字段对应的类型是 date。date就是日期&#xff0c;日期就不带时分秒。 3.返参实体类使用了JsonFormat(pattern “yyyy-MM-dd”) 导…...

计算机毕业设计python+spark+hive动漫推荐系统 漫画推荐系统 漫画分析可视化大屏 漫画爬虫 漫画推荐系统 漫画爬虫 知识图谱 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...