2025.04.19react面试题

以下是整理的 20 道 React 面试题,涵盖基础、进阶和实战应用,适用于社招或内推准备:


一、React 基础(适合初中级)

  1. React 中的组件有哪几种?它们有什么区别?

  2. 什么是 JSX?它与 HTML 有什么不同?

  3. React 是如何实现虚拟 DOM 的?它的优势是什么?

  4. 组件的生命周期函数有哪些?React 18 中的变化是?

  5. React 中 key 的作用是什么?为什么不能用 index 作为 key?

  6. 如何在函数组件中模拟 componentDidMount?

  7. 受控组件和非受控组件的区别?分别适用于什么场景?

  8. React 中事件绑定有哪些方式?有什么坑需要注意?

  9. 如何实现组件之间的通信?

  10. React 如何实现条件渲染和列表渲染?


二、Hooks 专题(React 16.8+)

  1. useEffect 有哪些使用场景?依赖数组写错会带来什么问题?

  2. useRef 和 useState 的区别?分别适用于哪些场景?

  3. React 中如何避免 useEffect 死循环?

  4. 如何实现一个自定义 Hook?能举个例子吗?

  5. 为什么不能在循环、条件或嵌套函数中调用 Hook?


三、性能优化与实战技巧

  1. React 中如何避免不必要的重新渲染?有哪些优化手段?

  2. React.memo、useMemo 和 useCallback 的作用与区别?

  3. React 中如何实现懒加载?如何配合 Suspense 使用?

  4. 如何在 React 中做错误边界处理?为什么函数组件不能做?

  5. React18 中 Concurrent Mode 是什么?对开发者有什么影响?

好的,下面是前 5 道 React 面试题,以八股文风格整理,方便记忆和背诵:


  1. React 中的组件有哪几种?它们有什么区别?

答:
React 组件主要分为两类:类组件(Class Component)与函数组件(Function Component)。
类组件通过 class 关键字定义,需继承 React.Component,具备生命周期函数、this.state 和 this.setState 等特性;
函数组件最初为纯展示组件,自 React 16.8 引入 Hook 后也能拥有状态与副作用逻辑,写法更简洁。
当前推荐使用函数组件,因其更易组合复用,性能优化更简单,官方也逐步弃用类组件。


  1. 什么是 JSX?它与 HTML 有什么不同?

答:
JSX 是 JavaScript 的语法扩展,允许在 JavaScript 中书写类似 HTML 的代码,用于描述 UI 结构。
JSX 本质是 React.createElement 的语法糖,最终会被编译为 JavaScript 对象。
与 HTML 的不同点包括:

所有标签必须闭合;

属性使用驼峰命名,如 className、onClick;

表达式需用 {} 包裹;

可以嵌套任意 JS 表达式。


  1. React 是如何实现虚拟 DOM 的?它的优势是什么?

答:
React 中的虚拟 DOM 是用 JavaScript 对象描述真实 DOM 结构的中间表示。每次状态变化后,会生成新的虚拟 DOM 树,并与旧的树进行 Diff 运算,找出差异部分,再最小化更新真实 DOM。
其优势包括:

避免直接操作真实 DOM,提高性能;

更好的跨平台能力;

有利于实现时间切片、异步渲染等高级特性。


  1. 组件的生命周期函数有哪些?React 18 中的变化是?

答:
类组件的生命周期分为三个阶段:

挂载阶段:constructor → render → componentDidMount;

更新阶段:shouldComponentUpdate → render → componentDidUpdate;

卸载阶段:componentWillUnmount。
React 16 后废弃部分不安全生命周期,如 componentWillMount,推荐使用 getDerivedStateFromProps 和 getSnapshotBeforeUpdate 替代。
React 18 推出了自动批处理与并发特性,对生命周期感知更强,建议使用函数组件 + Hook 替代类组件管理生命周期。


  1. React 中 key 的作用是什么?为什么不能用 index?

答:
key 是 React 用于识别列表中元素的唯一标识,在执行 Diff 算法时能更高效定位变动元素。
若使用 index,当列表顺序改变时可能导致组件错误复用、状态错乱、动画异常等问题。
应优先使用唯一且稳定的业务 id 作为 key,只有在列表静态、不会增删改时才可使用 index。


好的,继续为你整理 第 6~10 题 的 React 八股文风格问答:


  1. 如何在函数组件中模拟 componentDidMount?

答:
函数组件中可使用 useEffect 模拟类组件的 componentDidMount。
写法如下:

useEffect(() => {
// 初始化逻辑
}, []);

当 useEffect 的依赖数组传入空数组 [] 时,表示该副作用函数仅在组件首次渲染时执行一次,行为等价于类组件中的 componentDidMount。
该模式常用于请求初始化数据、设置事件监听、初始化定时器等场景。


  1. 受控组件和非受控组件的区别?分别适用于什么场景?

答:
React 中,表单组件可分为受控组件和非受控组件。

受控组件:其值受 React state 控制,通过 value 和 onChange 实现双向绑定。
优点是数据可控,易于校验和联动;

非受控组件:直接操作 DOM 读取表单值,通常配合 ref 使用。

适用场景:

受控组件适用于复杂交互和受状态驱动的场景;

非受控组件适用于性能敏感或简单场景,如登录表单、文件上传等。


  1. React 中事件绑定有哪些方式?有什么坑需要注意?

答:
React 中常见的事件绑定方式包括:

在 JSX 中绑定箭头函数(推荐):
onClick={() => handleClick(id)}

在组件外定义绑定函数:
onClick={handleClick},注意需在 constructor 中 bind:
this.handleClick = this.handleClick.bind(this);

使用 class fields 语法(推荐):
handleClick = () => { … }

注意事项:

每次 render 重新创建箭头函数会影响性能;

函数组件中事件默认具有自动绑定能力,不用显式 bind;

React 事件是合成事件,非原生事件,具备跨浏览器兼容性,支持事件池优化(v17 之后逐步废弃事件池机制)。


好的,以下是 第 11~15 题(Hooks 专题) 的八股文风格标准问答:


  1. useEffect 有哪些使用场景?依赖数组写错会带来什么问题?

答:
useEffect 是 React 中用于处理副作用的 Hook,常见使用场景包括:

组件挂载时请求数据;

监听事件或订阅操作;

依赖变化时执行操作;

清理副作用(如定时器、订阅)。

其语法如下:

useEffect(() => {
// 副作用逻辑
return () => {
// 清理逻辑
};
}, [dependencies]);

若依赖数组写错(漏依赖、写错变量等),可能导致:

副作用函数未正确触发或频繁执行;

状态不一致、数据不同步;

引发死循环或内存泄漏。

应借助 ESLint 插件(如 eslint-plugin-react-hooks)自动校验依赖项完整性。


  1. useRef 和 useState 的区别?分别适用于哪些场景?

答:
useRef 和 useState 都可用于在函数组件中存储数据,但用途与行为不同:

useState:用于声明响应式状态,状态变更会触发组件重新渲染;

useRef:用于存储可变值,变更不会触发组件重新渲染,常用于保存 DOM 引用或跨渲染周期保存变量。

适用场景对比如下:

表单输入值:useState;

DOM 节点操作:useRef;

记录上一次状态值或定时器 ID:useRef;

控制重新渲染逻辑:useRef 可避免因频繁更新而导致的性能浪费。


  1. React 中如何避免 useEffect 死循环?

答:
useEffect 死循环通常由以下原因导致:

依赖数组中包含每次 render 都变化的值(如函数、对象、数组);

副作用函数中更新了依赖项所关联的状态。

解决方式包括:

使用 useCallback 或 useMemo 对函数和对象进行稳定处理;

合理拆分多个 useEffect,细化每个副作用的关注点;

使用空依赖数组 [] 表示只执行一次(等价于 componentDidMount);

严格遵循 ESLint 对依赖项的提示,必要时用注释忽略。


  1. 如何实现一个自定义 Hook?能举个例子吗?

答:
自定义 Hook 是以 use 开头的函数,用于复用逻辑片段,让组件更简洁、更易维护。

示例:封装一个监听窗口大小的 Hook

import { useState, useEffect } from ‘react’;

function useWindowSize() {
const [size, setSize] = useState({ width: window.innerWidth, height: window.innerHeight });

useEffect(() => {
const handleResize = () => {
setSize({ width: window.innerWidth, height: window.innerHeight });
};
window.addEventListener(‘resize’, handleResize);
return () => window.removeEventListener(‘resize’, handleResize);
}, []);

return size;
}

使用方式:

const { width, height } = useWindowSize();

该 Hook 封装了监听逻辑,提升代码复用性和可读性。


  1. 为什么不能在循环、条件或嵌套函数中调用 Hook?

答:
React 的 Hook 调用必须遵循 “Hook 规则”,即:

只能在函数组件或自定义 Hook 的顶层调用 Hook;

不能在循环、条件、嵌套函数中调用 Hook。

原因是 React 依赖调用顺序识别每个 Hook 的位置。
若在条件或循环中调用 Hook,会导致调用顺序不一致,破坏内部 Hook 栈,从而引发运行时错误或逻辑异常。

官方提供 ESLint 插件 eslint-plugin-react-hooks,可帮助开发者自动检测 Hook 使用规范。


好的,下面是 第 16~20 题(性能优化与实战技巧) 的 React 八股文风格标准问答:


  1. React 如何优化组件性能?有哪些常见手段?

答:
React 性能优化的目标是减少无效渲染、避免重复计算与状态不一致。常见优化手段包括:

  1. 使用 React.memo:包装函数组件,避免 props 无变化时重复渲染;

  2. 使用 useMemo:缓存复杂计算结果,仅在依赖变化时重新计算;

  3. 使用 useCallback:缓存函数引用,防止子组件因函数变化而重渲染;

  4. 避免匿名函数和 inline 对象:避免每次 render 创建新引用;

  5. 拆分组件粒度:将大组件拆分为小组件,提升局部更新效率;

  6. 懒加载(React.lazy + Suspense):按需加载组件,减少初始包体积;

  7. 虚拟滚动:使用 react-window、react-virtualized 等库提升长列表渲染性能;

  8. 开启生产构建优化:确保使用 production 模式打包,开启 tree-shaking 和代码压缩。


  1. useMemo 和 useCallback 有什么区别?使用场景分别是什么?

答:
useMemo 与 useCallback 都用于性能优化,避免因重新渲染导致的重复计算或函数引用变更。

useMemo(fn, deps):返回 计算结果,常用于缓存变量(如复杂计算、筛选、排序等);

useCallback(fn, deps):返回 函数引用,常用于将函数传入子组件或用于依赖中防止无限循环。

使用场景:

useMemo:优化计算型表达式;

useCallback:优化函数传参与事件处理器。
需注意过度使用反而适得其反,建议仅在明显性能瓶颈场景下使用。


  1. 什么是 Context?使用时有哪些注意事项?

答:
React Context 是用于跨组件层级共享数据的机制,适用于全局状态传递如主题、用户信息等。核心 API 包括:

const ThemeContext = React.createContext(defaultValue);
<ThemeContext.Provider value={…}>

</ThemeContext.Provider>

在子组件中使用 useContext(ThemeContext) 获取上下文值。

注意事项:

每次 Provider 的 value 变化都会引发所有消费组件重新渲染;

可配合 useMemo 或分离 Provider 组件优化性能;

不适用于频繁变化的局部状态(如输入框内容、临时弹窗);


  1. React 中如何处理错误?如何实现错误边界?

答:
React 提供错误边界机制处理组件树中的渲染错误(不包括事件、异步逻辑等)。

实现方法:

  1. 创建类组件,定义 componentDidCatch 和 getDerivedStateFromError:

class ErrorBoundary extends React.Component {
state = { hasError: false };
static getDerivedStateFromError(error) {
return { hasError: true };
}
componentDidCatch(error, info) {
// 上报错误日志
}
render() {
return this.state.hasError ? : this.props.children;
}
}

  1. 使用方式:将其包裹目标组件

注意:错误边界只能捕获其子组件中的错误。


  1. React18 中的新特性有哪些?和之前版本有何不同?

答:
React 18 引入了多项新特性,提升并发渲染与用户体验能力:

  1. 自动批处理(Automatic Batching):多个 state 更新自动合并,减少 render 次数;

  2. 并发渲染架构(Concurrent Features):通过 startTransition 实现高优先级交互与低优先级更新并行处理;

  3. Transition API:可区分紧急与非紧急更新,提升响应性能;

const [isPending, startTransition] = useTransition();
startTransition(() => {
setSearchQuery(input);
});

  1. useId:解决 SSR 与客户端 ID 不一致的问题;

  2. ReactDOM.createRoot:替代 ReactDOM.render,支持并发模式;

  3. Streaming SSR with Suspense:服务器端渲染支持 Suspense 流式输出。

React 18 标志着进入“并发时代”,推荐逐步迁移核心项目使用新版能力。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术

1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…

Python爬虫实战:获取xie程网近两周长沙飞敦煌机票数据,为51出行做参考

一、引言 1.1 研究背景 伴随互联网技术的迅猛发展与人们生活水平的显著提升,在线旅游平台成为人们出行预订的重要途径。其中,飞机作为高效快捷的长途出行方式备受青睐。xie程网作为国内领先的在线旅游平台,汇聚了丰富的机票信息。对于计划在 51 出行期间从长沙飞往敦煌的旅…

Mujoco robosuite 机器人模型

import ctypes import os# 获取当前脚本所在的目录 script_dir os.path.dirname(os.path.abspath(__file__))# 构建库文件的相对路径 lib_relative_path os.path.join(dynamic_models, UR5e, Jb.so)# 拼接成完整的路径 lib_path os.path.join(script_dir, lib_relative_path…

【重学Android】02.Java环境配置的一些分享

背景说明 其实只是学习Android的话&#xff0c;只要下载好Android Studio开发工具&#xff0c;是自带JDK环境的&#xff0c;所以不需要再额外去进行配置&#xff0c;我之所以还要进行单独配置&#xff0c;是因为我其他的工具需要Java的环境&#xff0c;而且我目前用的是JDK 12…

Linux 网络编程:select、poll 与 epoll 深度解析 —— 从基础到高并发实战

一、IO 多路复用&#xff1a;解决并发 IO 的核心技术 在网络编程中&#xff0c;当需要同时处理大量客户端连接时&#xff0c;传统阻塞式 IO 会导致程序卡在单个操作上&#xff0c;造成资源浪费。IO 多路复用技术允许单线程监听多个文件描述符&#xff08;FD&#xff09;&#…

制作你的时间管理“局”#自制软件,5款AI编程对比测试

玩 AI 编程最有意思的地方&#xff0c;就是当你有想法的时候&#xff0c;可以随时测试、把想法具体化&#xff0c;甚至产品化。今天我们制作一个事件管理器&#xff0c;用来量化我们每天的时间安排&#xff0c;提高时间的利用率&#xff0c;提升生产力。 同样的一组 prompt &am…

大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署--完结

大数据系列 | 详解基于Zookeeper或ClickHouse Keeper的ClickHouse集群部署 1. ClickHouse与MySQL的区别2. 在群集的所有机器上安装ClickHouse服务端2.1. 在线安装clickhouse2.2. 离线安装clickhouse 3. ClickHouse Keeper/Zookeeper集群安装4. 在配置文件中设置集群配置5. 在每…

宏碁笔记本电脑怎样开启/关闭触摸板

使用快捷键&#xff1a;大多数宏碁笔记本可以使用 “FnF7” 或 “FnF8” 组合键来开启或关闭触摸板&#xff0c;部分型号可能是 “FnF2”“FnF9” 等。如果不确定&#xff0c;可以查看键盘上的功能键图标&#xff0c;一般有触摸板图案的按键就是触摸板的快捷键。通过设备管理器…

使用Mybaitis-plus提供的各种的免写SQL的Wrapper的使用方式

文章目录 内连接JoinWrappers.lambda和 new MPJLambdaWrapper 生成的MPJLambdaWrapper对象有啥区别&#xff1f;LambdaQueryWrapper 和 QueryWrapper的区别&#xff1f;LambdaQueryWrapper和MPJLambdaQueryWrapper的区别&#xff1f;在作单表更新时建议使用&#xff1a;LambdaU…

基于微信小程序的走失儿童帮助系统-项目分享

基于微信小程序的走失儿童帮助系统-项目分享 项目介绍项目摘要管理员功能图用户功能图系统功能图项目预览首页走失儿童个人中心走失儿童管理 最后 项目介绍 使用者&#xff1a;管理员、用户 开发技术&#xff1a;MySQLJavaSpringBootVue 项目摘要 本系统采用微信小程序进行开…

P3916 图的遍历

P3916 图的遍历 题目来源-洛谷 题意 有向图中&#xff0c;找出每个节点能访问到的最大的节点 思路 每个节点的最大节点&#xff0c;不是最长距离&#xff0c;如果是每个节点都用dfs去找最大值&#xff0c;显然1e6*1e6 超时了&#xff0c;只能60分从第一个节点开始遍历&…

掌握常见 HTTP 方法:GET、POST、PUT 到 CONNECT 全面梳理

今天面试还问了除了 get 和 post 方法还有其他请求方法吗&#xff0c;一个都不知道&#xff0c;这里记录下。 &#x1f310; 常见 HTTP 请求方法一览 方法作用描述是否幂等是否常用GET获取资源&#xff0c;参数一般拼接在 URL 中✅ 是✅ 常用POST创建资源 / 提交数据&#xff…

裸金属服务器的应用场景有哪些?

随着云计算技术不断发展&#xff0c;裸金属服务器作为一台既具有传统物理服务器特点的硬件设备&#xff0c;还具备云计算技术的服务器化服务功能&#xff0c;是硬件和软件相结合的网络设备&#xff0c;逐渐被越来越多的企业所关注&#xff0c;那么&#xff0c;裸金属服务器的应…

【得物】20250419笔试算法题

文章目录 前言第一题1. 题目描述2. 思路解析3. AC代码 第二题1. 题目描述2. 思路解析3. AC代码 第三题1. 题目描述2. 思路解析3. AC代码 前言 三道题目都比较简单&#xff0c;大家都可以试着做一下。 第一题 1. 题目描述 题目链接&#xff1a;矩阵变换 2. 思路解析 按题…

明远智睿2351开发板四核1.4G Linux处理器:驱动创新的引擎

在科技日新月异的今天&#xff0c;创新成为了推动社会进步的核心动力。而在这场创新的浪潮中&#xff0c;一款性能卓越、功能全面的处理器无疑是不可或缺的引擎。今天&#xff0c;我们介绍的这款四核1.4G处理器搭配Linux系统的组合&#xff0c;正是这样一款能够驱动未来创新的强…

Oracle Database Resident Connection Pooling (DRCP) 白皮书阅读笔记

本文为“Extreme Oracle Database Connection Scalability with Database Resident Connection Pooling (DRCP)”的中文翻译加阅读笔记。觉得是重点的就用粗体表示了。 白皮书版本为March 2025, Version 3.3&#xff0c;副标题为&#xff1a;Optimizing Oracle Database resou…

VS Code + GitHub:高效开发工作流指南

目录 一、安装 & 基本配置 1.下载 VS Code 2.安装推荐插件(打开侧边栏 Extensions) 3.设置中文界面(可选) 二、使用 VS Code 操作 Git/GitHub 1.基本 Git 操作(不输命令行!) 2.连接 GitHub(第一次使用) 三、克隆远程仓库到 VS Code 方法一(推荐): 方…

【LLM】llama.cpp:合并 GGUF 模型分片

GGUF&#xff08;GPT-Generated Unified Format&#xff09;是一种专为大规模语言模型设计的二进制文件格式&#xff0c;支持将模型分割成多个分片&#xff08;*-of-*.gguf&#xff09;。当从开源社区&#xff08;如 HuggingFace 或 ModelScope&#xff09;下载量化模型时&…

Ubuntu 系统下安装和使用性能分析工具 perf

在 Ubuntu 系统下安装和使用性能分析工具 perf 的步骤如下&#xff1a; 1. 安装 perf perf 是 Linux 内核的一部分&#xff0c;通常通过安装 linux-tools 包获取&#xff1a; # 更新软件包列表 sudo apt update# 安装 perf&#xff08;根据当前内核版本自动匹配&#xff09; …

Buffer of Thoughts: Thought-Augmented Reasoningwith Large Language Models

CODE: NeurIPS 2024 https://github.com/YangLing0818/buffer-of-thought-llm Abstract 我们介绍了思想缓冲(BoT)&#xff0c;一种新颖而通用的思想增强推理方法&#xff0c;用于提高大型语言模型(大型语言模型)的准确性、效率和鲁棒性。具体来说&#xff0c;我们提出了元缓冲…