React 面试高频题

一、React 基础(详细版)

1. React 是什么?核心特点

React 是声明式 UI 库特点:

  1. 声明式:描述想要什么,不用操作 DOM
  2. 组件化:可复用、独立维护
  3. 单向数据流:父 → 子,可预测
  4. 虚拟 DOM + Fiber:高效更新、可中断渲染
  5. JSX:HTML 写在 JS 里,编译成 createElement

2. 为什么 key 不能用 index?

diff 靠 key 判断节点复用

  • 数组增删前置 → index 错乱
  • 导致:组件状态错位、DOM 复用错误、渲染 bug正确:唯一稳定业务 id

3. 受控 vs 非受控组件

  • 受控:value 绑定 state,onChange 更新 → 完全可控、推荐
  • 非受控:用 useRef 取值,state 不绑定 → 简单场景、快

4. 合成事件和原生事件区别

  1. 合成事件:React 自己实现、事件委托、性能高、冒泡
  2. 原生事件:绑定真实 DOM
  3. 执行顺序:原生先执行 → 合成后执行
  4. 阻止冒泡互不生效

二、Hooks 全家桶(面试核心・详细)

1. useState

  • 产生局部状态
  • 更新异步批量,不立即改变
  • 状态不可变,必须新引用
  • 函数式更新:setCount (pre => pre + 1) 解决闭包

2. useEffect

副作用:请求、订阅、DOM 操作执行时机:

  • 空依赖:挂载 + 卸载
  • 有依赖:依赖变化执行
  • 返回函数:清理副作用(防内存泄漏)坑:漏依赖 → 闭包拿到旧值

3. useLayoutEffect

  • 同步执行、DOM 绘制前
  • 适合改 DOM、防止闪烁
  • 比 useEffect 慢,优先用 useEffect

4. useRef

  • 存值:跨渲染不变、不触发更新
  • 拿 DOM 元素
  • 穿透闭包

5. useMemo / useCallback

  • useMemo:缓存计算结果,减少重算
  • useCallback:缓存函数引用 ,防止子组件重复渲染注意:有成本,不要滥用

6. Hooks 使用规则

  1. 只在顶层调用
  2. 不在条件、循环、嵌套里用原因:依赖链表顺序不能乱,乱了状态错位

7. 闭包陷阱怎么解决?

  • 加全依赖
  • useRef 存最新值
  • useReducer 摆脱闭包

三、React 底层原理(二面必考・详细)

1. 虚拟 DOM

用 JS 对象描述 DOM好处:

  • 减少频繁真实 DOM
  • 跨平台
  • 便于 diff 计算

2. Diff 算法原理

同层比较 + 不跨层级流程:

  1. 类型不同 → 直接销毁重建
  2. 类型相同 → 对比属性
  3. 列表靠 key 找复用节点复杂度优化到 O(n)

3. Fiber 架构(重点背)

解决旧 React 一次性渲染卡死主线程两个阶段:

  1. Render 阶段(可中断、分片、优先级)
    • 遍历、diff、构建 Fiber 树
  2. Commit 阶段(不可中断)
    • 一次性更新 DOM、布局、绘制

4. React 更新流程

触发 setState→ 生成更新任务→ Fiber 调和(可中断)→ 收集 DOM 变更→ Commit 一次性渲染→ 浏览器绘制


四、性能优化(面试官最爱追问)

完整优化套路(背这一段)

  1. 拆分组件、状态下放:减少父渲染牵连子
  2. React.memo + useCallback + useMemo:阻断无效渲染
  3. 合理拆分 Context:避免全局一起刷新
  4. 懒加载:React.lazy + Suspense
  5. 长列表优化:虚拟滚动,只渲染可视区
  6. 减少重排重绘:批量 DOM、脱离文档流
  7. 图片 / 资源优化:懒加载、预加载

五、React 18 必问(2026 大厂高频)

1. 并发渲染 Concurrent Mode

渲染可中断、可优先级插队保证输入响应不卡顿

2. 自动批处理

Promise /setTimeout 里的 setState 也合并减少渲染次数

3. useTransition

区分紧急更新 / 非紧急更新例子:搜索输入高优、列表渲染低优

4. useDeferredValue

延迟一个值的更新,不阻塞 UI

5. Suspense

等待异步资源(接口 / 懒组件)显示 fallback

6. createRoot

替代旧 render,开启 18 所有新特性


六、状态管理(对比详细)

  1. 局部:useState /useReducer
  2. 简单全局:Zustand(轻、快、无 Context 嵌套)
  3. 大型项目:Redux Toolkit(规范、调试、中间件)
  4. 跨组件:拆分 Context,避免整体重渲染

七、高频问答题(详细标准答案)

1. setState 同步还是异步?

  • 合成事件、hooks、18 内部:异步批量
  • 原生事件、定时器、请求回调:同步目的:合并更新、提升性能

2. useEffect 依赖不写会怎样?

闭包陷阱,永远拿到旧变量,逻辑错乱

3. useMemo 什么时候不用?

简单计算、渲染成本低------ 缓存成本 > 收益,反而变慢

4. Context 为什么一改全渲染?

Context value 引用变 → 所有消费子树重新渲染解决:拆分多个 Context、原子化状态


八、必手写 6 个(附思路)

  1. useDebounce(防抖)
  2. useThrottle(节流)
  3. useFetch(loading / error / abort)
  4. useLocalStorage(持久化)
  5. 简易 useMemo /useCallback
  6. 虚拟列表核心:可视高度 + 滚动偏移 + 切片渲染
相关推荐
lichenyang45319 小时前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen20 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒20 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
奇奇怪怪的20 小时前
Embedding 模型 10+ 横向评测
前端
陈广亮20 小时前
Monorepo 从 0 到 1 实操指南 2026 版:pnpm catalogs + Turborepo 2.x + changesets 全链路
前端
子兮曰21 小时前
OpenMontage 深度解剖:你的 AI 编程助手,其实是个视频工作室
前端·后端·ai编程
敲代码的鱼21 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
子兮曰21 小时前
前端工具链的「Rust 化」:一场没有赢家的军备竞赛?
前端·后端·rust
Hyyy1 天前
Function Calling / Tool Use的原理和实现模式
前端·llm·ai编程