说明:标题提到的React 19在本文写作时(2023年3月)尚未发布(React 19于2024年发布)。
本文基于我参加的React面试经历,整理了常见的React面试题,以及对React 19新特性的预期问题,分享我的回答思路和准备建议。
一、基础题
1. React的核心思想是什么?
这是最基础的问题。
回答思路:
- 组件化:把UI拆成可复用的组件
- 声明式:描述UI应该是什么样,而不是怎么操作DOM
- 单向数据流:数据从父组件流向子组件
- 虚拟DOM:用JS对象描述DOM,提高更新效率
要点:组件化、声明式、单向数据流、虚拟DOM。
2. 类组件和函数组件的区别?
这个问题很常见。
回答思路:
- 类组件:用class定义,有生命周期,有this
- 函数组件:用function定义,用Hooks管理状态和副作用
- 函数组件更简洁,更易测试
- React官方推荐函数组件
- 类组件不再推荐新项目使用
要点:Hooks是函数组件的核心,函数组件是未来。
3. 什么是虚拟DOM?
虚拟DOM是React的核心概念。
回答思路:
- 用JS对象描述真实DOM
- 状态变化时,生成新的虚拟DOM树
- 和旧的虚拟DOM树对比(Diff算法)
- 只更新变化的部分到真实DOM
- 提高了渲染效率
要点:虚拟DOM不是比直接操作DOM快,而是让更新更高效、更可预测。
4. React的生命周期?
虽然函数组件用Hooks,但生命周期还是会问。
回答思路:
- 挂载:constructor, render, componentDidMount
- 更新:render, componentDidUpdate
- 卸载:componentWillUnmount
- 对应的Hooks:useEffect
要点:理解每个阶段做什么,以及对应的Hooks。
二、Hooks题
5. useEffect的依赖数组怎么理解?
这是Hooks最常考的问题。
回答思路:
- 依赖数组决定effect什么时候执行
- 空数组:只在挂载时执行一次
- 有依赖:依赖变化时执行
- 不传数组:每次渲染都执行
- 要确保依赖数组完整,否则会有闭包问题
要点:理解闭包,用ESLint插件检查依赖。
6. useMemo和useCallback的区别?
这个问题也很常见。
回答思路:
- useMemo:缓存计算结果,避免重复计算
- useCallback:缓存函数引用,避免子组件不必要的重渲染
- 两者都用依赖数组控制更新
- 不要滥用,先测量再优化
要点:useMemo缓存值,useCallback缓存函数。
7. 自定义Hooks的规则?
自定义Hooks是React的高级用法。
回答思路:
- 以use开头
- 只能在组件或其他Hooks中调用
- 只能在顶层调用,不能在条件或循环中
- 可以封装复用的逻辑
- 自定义Hooks是逻辑复用的最佳方式
要点:自定义Hooks让逻辑复用更简单。
8. useState和useReducer的区别?
这个问题考察状态管理的理解。
回答思路:
- useState:简单状态,适合单个值
- useReducer:复杂状态,适合多个相关值
- useReducer更可预测,更容易测试
- useReducer适合状态逻辑复杂的场景
- 两者可以互换,看场景选择
要点:简单状态用useState,复杂状态用useReducer。
三、进阶题
9. React的Diff算法?
Diff算法是React的核心。
回答思路:
- 同层比较,不跨层
- 不同类型的元素,直接替换
- 同类型的元素,更新属性
- 列表用key标识,提高Diff效率
- key要稳定、唯一、可预测
要点:理解Diff的策略,key的重要性。
10. 什么是受控组件和非受控组件?
表单相关的问题。
回答思路:
- 受控组件:表单值由React状态控制
- 非受控组件:表单值由DOM自己管理,用ref获取
- 受控组件更符合React的思想
- 非受控组件更简单,适合简单场景
- 大部分情况用受控组件
要点:受控组件是React的推荐方式。
11. Context怎么用?有什么问题?
Context是React的状态管理方案。
回答思路:
- 用createContext创建
- 用Provider提供值
- 用useContext消费
- 适合全局状态,如主题、用户信息
- 问题:Provider的value变化会导致所有消费者重渲染
要点:Context适合真正全局的状态,不要滥用。
12. 性能优化的方法?
性能优化是面试常考题。
回答思路:
- React.memo:优化子组件重渲染
- useMemo:缓存计算结果
- useCallback:缓存函数
- 虚拟化长列表
- 代码分割(React.lazy)
- 先测量再优化
要点:性能优化要有针对性,不要过早优化。
四、React 18相关题
13. React 18的新特性?
React 18是当前最新稳定版。
回答思路:
- 并发渲染:可中断的渲染
- 自动批处理:所有更新自动批处理
- useTransition:标记非紧急更新
- useDeferredValue:延迟更新值
- Suspense改进:支持数据获取
- 服务端组件:实验性特性
要点:并发渲染是React 18的核心。
14. 并发渲染是什么?
并发渲染是React 18的核心特性。
回答思路:
- 渲染可以被中断
- 高优先级更新先渲染
- 低优先级更新可以延后
- 提高了应用的响应性
- 不需要手动管理,React自动处理
要点:并发渲染让UI更流畅。
15. useTransition怎么用?
useTransition是React 18的新Hook。
回答思路:
- 标记非紧急更新
- 比如搜索、过滤
- 紧急更新(输入)立即响应
- 非紧急更新(结果)可以延迟
- 返回isPending和startTransition
要点:useTransition让用户体验更好。
五、React 19预期题
16. 你了解React 19的预期特性吗?
虽然React 19还没发布,但可以聊预期。
回答思路:
- 服务端组件可能稳定
- 可能有新的Hooks(useFormStatus、useOptimistic)
- 文档可能更新
- 性能继续优化
- 更好的TypeScript支持
- 关注官方RFC和博客
要点:展示你关注React的发展方向。
17. 服务端组件是什么?
服务端组件是React的未来方向。
回答思路:
- 组件在服务端渲染
- 不需要发送JS到客户端
- 可以直接访问后端资源
- 减少客户端JS体积
- 和客户端组件配合使用
- "use client"标记客户端组件
要点:服务端组件改变了前端开发方式。
18. 你怎么看React的未来发展?
开放性问题,考察你的思考。
回答思路:
- 并发渲染会越来越重要
- 服务端组件会成为主流
- 元框架(Next.js等)会更流行
- AI和React的结合
- React会继续进化,但核心思想不变
要点:展示你的视野和思考。
六、实战题
19. 怎么设计一个复杂的表单?
实战题,考察工程能力。
回答思路:
- 用受控组件
- 表单状态管理(useState或useReducer)
- 验证(实时验证或提交验证)
- 错误提示
- 提交状态(loading、success、error)
- 可以用表单库(React Hook Form、Formik)
要点:考虑用户体验和边界情况。
20. 怎么处理大列表的性能?
性能实战题。
回答思路:
- 虚拟化:只渲染可见区域
- 用react-window或react-virtualized
- 分页或无限滚动
- 用useMemo优化列表项
- 图片懒加载
- 避免在渲染中做复杂计算
要点:虚拟化是大列表的关键。
21. 怎么组织React项目的结构?
工程题,考察项目经验。
回答思路:
- 按功能分,不是按类型分
- components、pages、hooks、utils、services
- 组件和样式放一起
- 公共组件抽出来
- 保持结构清晰,方便查找
要点:项目结构要清晰、可维护。
七、面试准备建议
1. 打好基础
面试准备,首先打好基础。
- React的核心概念
- Hooks的原理和用法
- 生命周期
- 状态管理
- 性能优化
基础扎实,才能应对各种问题。
2. 理解原理
不要只会用,要理解原理。
- 虚拟DOM和Diff算法
- Hooks的实现原理
- 状态更新机制
- 并发渲染的原理
- 服务端组件的原理
理解原理,才能深入回答。
3. 多做项目
项目经验很重要。
- 做一些复杂的项目
- 遇到问题,解决问题
- 总结经验
- 面试时能讲出细节
项目经验,是最好的面试准备。
4. 关注动态
关注React的最新动态。
- 官方博客
- React Conf
- RFC讨论
- 优秀的技术文章
- 了解React 19的预期
展示你对技术的热情。
5. 模拟面试
可以找人模拟面试。
- 练习表达
- 发现薄弱环节
- 提高应变能力
- 积累面试经验
模拟面试,能让你更从容。
八、写在最后
React面试题,从基础到进阶,从Hooks到并发渲染,从实战到React 19预期,覆盖了很多方面。
准备面试,要打好基础,理解原理,多做项目,关注动态。React 19虽然还没发布,但了解它的预期特性,能展示你的视野。
2023年了,React依然是最流行的前端框架。不管是面试还是工作,深入理解React,都能让你更有竞争力。
最后,用一句话总结:"React面试,考的不是你背了多少题,而是你对React的理解有多深。打好基础,理解原理,多做项目,才能从容应对。"
祝你面试顺利。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录