从互联网整理而来
一、JS 基础前置
- 原型与原型链
- 闭包、闭包引发的内存泄漏场景
- 同步异步、宏任务微任务执行顺序
- Promise 状态、静态方法、链式调用
- async/await 原理
- 深浅拷贝实现与区别
- this 指向五种场景
- 箭头函数与普通函数差异
- ES6 解构、展开运算符、剩余参数
- var / let / const 区别
- CommonJS 与 ES Module 差异
- TypeScript 接口、泛型、交叉类型、联合类型
- EventLoop 完整执行流程
- 防抖节流实现原理
- 纯函数定义与特性
二、React 基础核心概念
- React 设计思想与核心理念
- 虚拟 DOM 是什么,作用与优势
- JSX 语法本质,编译产物
- JSX 中 {} 可放入哪些内容,不能放什么
- React 元素与组件区别
- 函数组件与类组件区别
- 纯组件 PureComponent 原理
- React 单向数据流含义
- props 只读特性,为什么不能直接修改
- props.children 有哪些类型
- key 的作用,为什么不能用 index 做 key
- React 列表渲染注意事项
- className 代替 class、htmlFor 代替 for 原因
- React 事件绑定与原生 DOM 事件差异
- 合成事件原理、事件委托机制
- 阻止合成事件冒泡几种方式
- dangerouslySetInnerHTML 使用场景与风险
- React 为什么不直接操作 DOM
- Fragment 作用,短语法 <>
- React 严格模式 StrictMode 作用
三、类组件生命周期(Class Component)
- 类组件完整生命周期分哪三个阶段
- constructor 执行时机与作用
- static getDerivedStateFromProps 执行时机与用途
- shouldComponentUpdate 返回值作用
- render 执行规则,禁止在其中修改 state
- componentDidMount 执行时机、常用场景
- getSnapshotBeforeUpdate 触发时机、返回值用途
- componentDidUpdate 参数含义,依赖判断写法
- componentWillUnmount 清理资源场景
- 废弃生命周期函数有哪些,为什么废弃
- props 变化触发的生命周期流程
- setState 同步还是异步,底层批量更新逻辑
- setState 两种传参形式(对象/函数)区别
- 多次连续 setState 合并规则
- 如何在 setState 后拿到最新 state
四、Hooks 全套(React16.8+)
- Hook 诞生背景,解决类组件什么痛点
- Hook 使用两条硬性规则
- useState 底层原理,为何数组解构不受顺序影响
- useState 传入函数初始化的优势
- useEffect 作用,依赖数组含义
- useEffect 模拟生命周期分别怎么写
- useEffect 返回清理函数执行时机
- 依赖数组漏传变量引发的闭包陷阱
- useLayoutEffect 和 useEffect 执行顺序、区别
- useMemo 缓存计算值,解决什么问题
- useCallback 缓存函数,搭配子组件使用场景
- useMemo 与 useCallback 性能误区
- useRef 存储DOM、存储可变数据两种用法
- ref 传递 forwardRef 使用场景
- useImperativeHandle 作用
- useContext 跨层级传值,使用缺陷
- useReducer 适用场景,和 useState 对比
- useReducer 简单实现思路
- useId 作用,解决什么问题
- useTransition 区分紧急/非紧急更新
- useDeferredValue 延迟计算值
- useSyncExternalStore 订阅外部数据源
- useDebugValue 自定义Hook调试展示
- 自定义 Hook 封装规范,复用逻辑思路
- Hook 闭包陷阱完整成因与解决方案
五、React18 新特性
- React18 并发渲染 Concurrent Mode 含义
- 自动批处理更新范围变化
- createRoot 替换 legacy root 差异
- Suspense 服务端/客户端用法
- Transitions API 解决场景
- 自动插入批处理,异步回调内也合并更新
- useTransition 与 useDeferredValue 区别
- 服务端组件 RSC 基础概念
- StrictMode 双重渲染机制目的
- 批量更新边界,何时不会合并state更新
六、Diff 算法与渲染更新
- React Diff 三大策略
- 同层比较,不跨层级对比原因
- 无key、index key、唯一key三种场景对比
- 节点删除、新增、移动判断逻辑
- 文本节点、组件节点 Diff 区别
- 列表 Diff 优化逻辑
- 什么情况下组件会重新渲染
- 如何避免不必要的重渲染
- memo、useMemo、useCallback 配合使用完整逻辑
- 渲染流程:render → 生成VNode → Diff → 真实DOM更新
七、组件通信方案
- 父子组件 props 传值、回调传方法
- 多层级透传 props 缺点
- Context API 跨层级通信优缺点
- Context 配合 useReducer 简易状态管理
- 父访问子组件实例 ref
- 子调用父方法回调函数
- 兄弟组件通信几种方案
- 全局事件总线实现与缺陷
- 跨页面全局状态管理方案对比
八、状态管理 Redux / Redux Toolkit / Zustand
- Redux 三大核心原则
- Redux 五大核心概念:Store、Action、Reducer、Dispatch、State
- Reducer 必须纯函数要求
- Action plain object 规范,为什么不能异步
- 中间件 middleware 作用,执行流程
- redux-thunk 异步处理原理
- redux-saga 对比 thunk 优势
- combineReducers 拆分模块原理
- react-redux 核心 API Provider、connect
- mapStateToProps、mapDispatchToProps 作用
- useSelector、useDispatch Hook 用法
- Redux 数据单向流动完整流程
- Redux Toolkit 解决原生Redux哪些痛点
- createSlice 内置 reducer、action 生成
- RTK 内置immer 实现可变写法原理
- RTK Query 接口缓存、请求管理
- Zustand 轻量状态库对比Redux优势
- 状态持久化 redux-persist 流程
- 大型项目状态库选型思路
- 多组件共享全局状态最佳实践
九、React Router v6
- v5 与 v6 核心改动差异
- createBrowserRouter 路由配置方式
- BrowserRouter、HashRouter、MemoryRouter 区别
- Routes 替代 Switch 作用
- Route element 传组件写法
- useNavigate 替代 useHistory
- 路由传参 params、search、state 三种方式
- useParams、useSearchParams 使用
- 嵌套路由 Outlet 占位原理
- index 索引路由作用
- Link、NavLink 区别
- 路由守卫鉴权封装方案
- 路由懒加载 + Suspense 配置
- useLocation 获取路由信息
- 动态路由、路由拦截封装
十、表单处理
- 受控组件与非受控组件定义、区别
- 受控组件完整实现思路
- 非受控组件通过 ref 获取值场景
- 多表单项统一封装受控逻辑
- 第三方表单库 Formik / React Hook Form 对比
- React Hook Form 非受控高性能原理
- 表单校验方案:原生、yup、zod
- 表单批量重置、回填数据处理
十一、样式方案
- inline 内联样式优缺点
- CSS Modules 样式隔离原理
- styled-components CSS-in-JS 原理
- emotion 与 styled-components 对比
- tailwindcss 在React项目使用优势
- 动态样式几种实现方式
- 全局样式污染解决方案
十二、工程化构建
- Create React App 底层 webpack 配置
- Vite 构建React项目优势,esbuild预构建
- vite.config.js 常用配置项
- webpack 处理jsx、ts-loader流程
- babel 转换 JSX、polyfill 原理
- .env 环境变量区分开发/测试/生产
- 跨域代理 proxy 配置
- 路由懒加载分包代码分割
- Tree-Shaking 生效条件
- 打包体积优化手段
- 第三方组件库按需引入配置
- unplugin-auto-import 自动导入hooks
十三、网络请求封装
- axios 请求拦截、响应拦截封装
- 全局 loading、统一错误处理
- token 过期无感刷新实现逻辑
- 重复请求取消方案 CancelToken
- 请求并发处理
- 封装自定义请求Hook
- SWR / React Query 数据请求缓存库原理
- React Query 自动重请求、缓存失效策略
十四、性能优化专题
- 组件无效重渲染全部诱因
- memo 缓存函数组件条件
- useCallback 缓存函数使用场景
- useMemo 缓存计算结果适用场景
- 列表渲染优化策略
- 虚拟列表 react-window / react-virtualized 原理
- 图片懒加载实现
- 路由懒加载分包优化首屏
- 大组件拆分、状态下沉优化
- 避免在render内创建函数/对象
- React DevTools Profiler 排查卡顿
- 减少Context频繁更新范围
- 定时器、订阅事件组件卸载清理
- 打包体积压缩:gzip、剔除无用依赖
- 并发更新优化用户交互体验
十五、进阶底层原理
- Fiber 架构解决旧架构什么问题
- Fiber 节点结构、任务拆分机制
- 协调阶段、提交阶段分工
- 可中断、可恢复、可优先级调度原理
- 调和过程完整流程
- 批量更新实现机制
- 合成事件系统底层池化机制
- React 事务机制
- Portal 传送门实现原理,事件冒泡特点
- ErrorBoundary 错误捕获范围,无法捕获哪些错误
- React 服务端渲染 SSR 流程
- Next.js 与 CRA 区别,SSR/SSG/ISR 概念
- Hydrate 水合作用,水合不匹配成因
- RSC React Server Components 运行机制
- 微前端中 React 应用隔离方案
十六、项目实战场景题
- 项目目录分层架构设计
- 状态管理选型理由
- 大型表单封装思路
- 页面按钮、接口权限控制实现
- 首屏加载缓慢优化方案
- 列表大量数据渲染卡顿解决
- 全局弹窗、消息提示封装
- 路由鉴权、未登录跳转逻辑
- 组件复用抽离自定义Hook规范
- 线上报错捕获监控方案
- 多环境变量、多渠道打包配置
- 防抖节流在搜索框场景实现
- 页面返回保留表单状态实现
- 重复提交接口拦截处理
- React 项目迁移 TS 改造思路