给 memo 子组件传内联对象或函数为什么会失去优化机会?
解释内联对象与箭头函数每轮产生新引用的原因,用筛选工具栏示例展示 useMemo 和 useCallback 的完整依赖,并讨论减少 props、移动对象创建位置和避免空依赖闭包错误。
程序员面试题库第 72 页,收录第 3551–3600 题,共 5000 道完整解析,覆盖前端、JavaScript、React、Vue、Node.js、AI Agent、网络、数据库与系统设计。
按稳定语义路径排序
解释内联对象与箭头函数每轮产生新引用的原因,用筛选工具栏示例展示 useMemo 和 useCallback 的完整依赖,并讨论减少 props、移动对象创建位置和避免空依赖闭包错误。
用父组件计数与子组件成绩卡的示例解释 React.memo 如何逐项比较 props,区分父级更新、本地状态、Context 和重新挂载,并说明渲染次数为什么不能成为业务正确性的条件。
对照函数组件与类组件解释 memo 和 PureComponent 的比较范围,使用独立展开状态演示自身更新,说明 shouldComponentUpdate 与 arePropsEqual 返回值方向,以及迁移时的 state 合并差异。
从频繁变化的输入、便宜的子树、深比较和宽 Context 订阅分析 React.memo 无收益的原因,给出可复现的性能对照步骤,区分渲染次数减少与用户交互真正变快。
围绕“React 如何决定多个待处理更新的先后顺序,车道优先级模型解决什么问题”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出按更新来源分优先级、高优可抢占低优的调度思路。
围绕“React Profiler 组件如何包裹子树,onRender 回调能拿到哪些指标”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 id/phase/actualDuration 等回调字段含义。
围绕“Profiler 报告的 actualDuration 与 baseDuration 差异说明什么优化机会”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出实际耗时与无 memo 全量耗时对比反映 memo 收益。
围绕“为什么生产环境默认拿不到 React Profiler 数据, profiling 构建有什么开销”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出生产构建移除 profiling 能力及其原因与按需开启的代价。
围绕“为什么并发渲染要求组件渲染必须是纯函数,副作用应该放在哪里”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出渲染可能被中断重放导致副作用重复执行。
围绕“React 的 render 阶段和 commit 阶段分别做什么,对性能优化有什么意义”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分纯计算与 DOM 提交两个阶段及其对中断和副作用放置的影响。
围绕“startTransition 标记的非紧急更新在调度上有什么不同的行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出被标记的更新可被打断、让位给紧急更新。
围绕“并发渲染下直接订阅外部 store 为什么会出现 tearing,useSyncExternalStore 如何解决”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出中断期间外部值变化导致同次渲染读到不一致值的问题及 API 的一致快照保证。
围绕“React 19 中 startTransition 接受 async 函数(Action)后与 React 18 ”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须对比 React 19 异步 Action 自动管理 pending/错误与 React 18 只接受同步作用域的差异。
围绕“为什么不能把受控输入框的 value 更新包在 startTransition 里”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出输入是受控同步渲染、延迟会导致打字卡顿/丢字符。
围绕“为什么 transition 不能减少渲染的总工作量,什么场景用它没有收益”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 transition 只改变优先级和可中断性,并给出真正耗时在计算本身时的无效场景。
围绕“transition 与 Suspense 配合时如何避免已显示内容被 fallback 骨架屏替换”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 transition 让已有内容停留直到新数据就绪这一行为。
围绕“用 transition 优化搜索输入与用防抖优化有什么本质区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出 transition 不延迟更新而是降低优先级、仍每次响应。
围绕“优化慢列表渲染时,useTransition 和 useDeferredValue 应该如何选择”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出能控制 setState 入口用 transition、只能拿到值用 deferredValue 的判断标准。
围绕“把每次渲染都新建的内联函数放进 useEffect 依赖数组会导致什么问题,如何修复”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出函数引用变化触发 effect 反复执行的症状及 useCallback/移入 effect 两种修法。
围绕“为什么只用 useCallback 而子组件没有 memo,仍然阻止不了子组件重渲染”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出父组件重渲染本身就会重渲染子组件这一前提。
围绕“useCallback 解决了什么问题,它的返回值在渲染之间如何保持”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出按依赖缓存函数实例保持引用稳定。
围绕“useCallback 的依赖数组写错为什么会产生读取到旧 state 的过期回调”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出缓存函数闭包捕获了旧值这一机制与修复方式。
围绕“useDeferredValue 在组件首次渲染时是否会产生延迟效果”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出初始渲染 deferredValue 等于原值、无延迟行为这一边界。
围绕“为什么 useDeferredValue 通常要和 React.memo 配合才能真正看到性能收益”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出延迟重渲染需要子树在紧急渲染中可被跳过的前提。
围绕“useDeferredValue 返回的滞后值在渲染过程中经历哪两个阶段”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出先以旧值渲染、后台再以新值重渲染的过程。
围绕“使用 useDeferredValue 时如何判断并提示用户当前展示的是过期内容”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出比较原值与 deferredValue 判断过期并做视觉降级。
围绕“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 缓存函数引用的区别,展示完整依赖和旧闭包边界,并说明函数创建、函数调用、请求去重与异步缓存并不是同一件事。
围绕“useTransition 返回的 isPending 适合设计什么样的加载反馈”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须答出用 pending 状态做内联弱反馈而非替换内容的 UX 决策。
围绕“action 中执行长时间异步任务(如文件上传)时,如何避免阻塞主线程”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明通过 background task + polling or redirect to status page,不能让 acti。
围绕“action 中发生客户端无法处理的错误(如网络中断)时,如何正确提示用户”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明通过 throw new Error() 并在 error boundary 渲染,不能仅在 console 打印。
围绕“action 如何接收动态生成的表单字段(如 JSON 字符串或数组)”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明通过 FormData 或 JSON.parse 处理,不能仅提 input name 固定。
围绕“使用 action 处理表单提交时,如何确保用户在提交后仍能保留当前导航状态”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 action 通过返回 redirect / json / undefined 决定后续行为,不能只提 useNavigate。
围绕“action 如何处理 multipart/form-data 表单(如文件上传)?是否支持原生 file inpu”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明支持通过 formData API 接收,无需额外库,不能误认为需特殊配置。
围绕“action 适合处理哪些类型的数据变更操作?与 loader 区别在哪”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 action 用于写操作(如创建/更新),loader 用于读操作,不能混淆副作用。
围绕“action 中如何检查用户权限?是否可以在 action 内部拒绝请求并返回错误”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明可在 action 内判断权限并抛出错误,不能仅靠前端路由守卫。
围绕“action 中如何阻止表单默认提交行为?是否需要显式取消”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 action 默认阻止,无需额外操作,不能误解为需 preventDefault。
围绕“action 重定向的目标路径是否支持动态生成?如何基于表单数据构建目标地址”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明通过返回 redirect(new URL(...)) 动态构造,不能硬编码路径。
围绕“action 返回不同的响应类型(如 redirect、json、null)时,对导航行为有何不同影响”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖必须区分 redirect 触发跳转,json 用于客户端解析,null 保持当前页,不能混为一谈。
围绕“action 中执行服务器端表单验证失败后,如何向客户端返回具体错误信息并保持表单状态”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明通过返回 { error: '...' } 并保留原始表单数据,不能只提 useActionData。
围绕“action 执行过程中,如何持久化用户会话状态以便后续页面使用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明通过 setCookie、localStorage、sessionStorage 保存,不能依赖内存变量。
围绕“嵌套路由中,父路由的 loader 与子路由的 loader 之间如何传递数据?是否共享状态”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要解释 nested route loader 之间的数据依赖关系与独立性,不能混淆为组件状态或 context 传递。
围绕“如何在 React Router v7 中自定义 error boundary 的样式与交互行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明通过 render custom component in error boundary,不能仅改 CSS。
围绕“React Router 里的 error boundary 在组件卸载后还能正常工作吗?其生命周期如何”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖需要说明 error boundary 在整个路由树内有效,即使组件已卸载,不能认为失效。