React memo 能阻止 Context 更新传给深层消费者吗?
解释 Provider 与消费者之间的 memo 边界为何不能拦截 Context 更新,区分 props、Context 和本地状态三种渲染来源,并说明外层读取、内层接收必要 props 的优化方式。
React · React 性能面试题第 1 页,显示第 1–29 题,共找到 29 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
解释 Provider 与消费者之间的 memo 边界为何不能拦截 Context 更新,区分 props、Context 和本地状态三种渲染来源,并说明外层读取、内层接收必要 props 的优化方式。
围绕“React Context 不支持选择器,组件只想订阅其中一部分数据时有哪些官方认可的规避方案及各自代价”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须对比拆分 context、memo 子组件、useSyncExternalStore 三条路线的适用前提,不展开 tearing 的。
结合编辑器设置、光标状态与命令入口,说明 Context 拆分应看消费者重叠、更新频率和业务生命周期,避免只按字段数、Provider 层数或强制 useMemo 作决定。
解释内联对象怎样造成 Context value 身份变化,用完整 JSX 示例区分无关计数更新与真实主题更新,并说明 useMemo 依赖、函数缓存和 React Compiler 的适用边界。
React 列表筛选、合计和权限判断怎样从现有 props 与 state 直接计算?结合订单页面解释冗余状态造成的旧值提交、额外更新,以及 useMemo 和用户编辑草稿的适用边界。
围绕“自定义 Hook 返回的回调函数在每次渲染都变新引用,导致调用方 effect 反复执行,该如何处理”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确在 Hook 内部用 useCallback 或重构成更稳定的契约来收敛函数身份。
围绕“React 的 useMemo 能解决哪两类问题,为什么不能把它当作结果一定会被缓存的语义保证”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要明确跳过昂贵计算与保持引用稳定配合 memo 两类用途、以及 React 可能丢弃缓存需按性能优化而非正确性依赖使用。
通过候选人列表说明 React.memo 自定义比较器需要覆盖全部输出与事件行为,解释函数 prop 导致旧闭包的风险、不可变数据前提,以及有界逐项比较和深比较的成本取舍。
解释内联对象与箭头函数每轮产生新引用的原因,用筛选工具栏示例展示 useMemo 和 useCallback 的完整依赖,并讨论减少 props、移动对象创建位置和避免空依赖闭包错误。
用父组件计数与子组件成绩卡的示例解释 React.memo 如何逐项比较 props,区分父级更新、本地状态、Context 和重新挂载,并说明渲染次数为什么不能成为业务正确性的条件。
对照函数组件与类组件解释 memo 和 PureComponent 的比较范围,使用独立展开状态演示自身更新,说明 shouldComponentUpdate 与 arePropsEqual 返回值方向,以及迁移时的 state 合并差异。
从频繁变化的输入、便宜的子树、深比较和宽 Context 订阅分析 React.memo 无收益的原因,给出可复现的性能对照步骤,区分渲染次数减少与用户交互真正变快。
围绕“Profiler 报告的 actualDuration 与 baseDuration 差异说明什么优化机会”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出实际耗时与无 memo 全量耗时对比反映 memo 收益。
围绕“把每次渲染都新建的内联函数放进 useEffect 依赖数组会导致什么问题,如何修复”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出函数引用变化触发 effect 反复执行的症状及 useCallback/移入 effect 两种修法。
围绕“为什么只用 useCallback 而子组件没有 memo,仍然阻止不了子组件重渲染”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出父组件重渲染本身就会重渲染子组件这一前提。
围绕“useCallback 解决了什么问题,它的返回值在渲染之间如何保持”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出按依赖缓存函数实例保持引用稳定。
围绕“useCallback 的依赖数组写错为什么会产生读取到旧 state 的过期回调”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出缓存函数闭包捕获了旧值这一机制与修复方式。
围绕“为什么 useDeferredValue 通常要和 React.memo 配合才能真正看到性能收益”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出延迟重渲染需要子树在紧急渲染中可被跳过的前提。
围绕“React 实验性 API useEffectEvent 相比 useCallback 解决稳定回调问题有什么不同思”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须对比『非响应式事件函数读取最新值』与『依赖数组缓存引用』两种思路,并注明实验性版本状态。
围绕“useMemo 依赖数组漏写或多写会有什么症状,如何保证依赖正确”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分漏依赖导致陈旧值与多依赖导致缓存失效两类症状。
解释 useMemo 在开发编辑、初次挂载挂起等情况下可能丢弃缓存,用房间连接示例说明如何把资源创建与清理放在 Effect,并区分缓存、state、ref 和重新挂载后的生命周期。
围绕“什么情况下不该使用 useMemo”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出廉价计算、非稳定引用需求等不该用的判断标准。
用按标签筛选条目的示例解释 useMemo 何时计算、如何按 Object.is 比较依赖,说明同引用突变、新数组重算、A 到 B 再到 A,以及纯计算与开发严格模式的边界。
围绕“只在挂载时算一次的昂贵初始值,应该用 useMemo 还是 useState 惰性初始化”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 useMemo 依赖变化会重算而惰性初始化只算一次这一关键差异。
围绕“与 props 和 state 无关的常量,放 useMemo 里和提升出组件外有何区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须指出与组件输入无关的值应提升到模块作用域而非占 Hook。
通过报价与确认按钮解释 useMemo 缓存计算结果、useCallback 缓存函数引用的区别,展示完整依赖和旧闭包边界,并说明函数创建、函数调用、请求去重与异步缓存并不是同一件事。
围绕“在 React 中如何不可变地更新数组里某一个对象元素的字段”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须给出用 map 遍历、仅对目标元素返回新对象、其余元素保持原引用的写法,以及保持未变元素引用对 memo 的意义。
围绕“为什么说 React 的 setState 与 dispatch 函数引用是稳定的,这对依赖数组和 props 传递”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 React 保证这两个函数跨渲染引用不变,可以安全地从 effect 依赖和 memo 比较中省略或稳定传递。
围绕“为什么 React 的不可变更新习惯与 React.memo、useMemo 的浅比较是配套的”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明浅比较依赖「引用变则数据变」的约定,结构共享让未变部分保持引用从而跳过渲染,原地修改会破坏这一约定。