题目重点:先测昂贵计算,再判断缓存是否有效,不把useMemo当副作用或业务状态保证。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练计算为纯函数,依赖采用对象身份比较;是否有自动Compiler优化依项目配置确认。
解题路线
- useMemo缓存某次计算结果,在依赖不变时复用;它不是保证组件不render,也不是改变源数据的持久store。计算应在没有memo时也正确。
- 所有反应式输入都要列为依赖,漏项会保留旧结果。每次render新建依赖对象可使缓存每次失效,应先让依赖语义和身份稳定,而非再层层套memo。
- 适用于确实昂贵且输入常不变的计算,或需要稳定结果身份配合memo子组件;短小加法可能比较/维护成本超过收益。先在生产模式和代表设备测。
- memo只减后续重算,不加速首次计算;返回的大对象也占缓存内存。React可丢缓存,不能把它当保存业务状态/资源唯一实例的正确性依赖。
- 计算中不可发请求、注册订阅或修改props,因为render可重复/放弃,开发严格检查也可能多调用;副作用放合适同步机制并管理清理。
- 启用React Compiler的项目可能减少手工memo需求,但不意味着任意代码无需性能观察。回答应问实际编译配置,不盲称useMemo已没用或处处必用。
手动走一遍
过滤大列表依赖items和filter,theme变而二者身份不变可复用;若items每render从父传新数组,即使值相同也可能重算。代码正确性不应依赖缓存永不丢。
规模与取舍
计算T(N)命中时省该工作,仍需依赖比较O(K),首次或失效仍T(N);缓存结果空间按结果大小,不是O(1)一概而论。
易错点与追问
容易失分的边界
- useMemo阻止组件render。
- 漏依赖当优化。
- 计算回调带副作用。
继续深挖
- useCallback与memo怎样配合?
- 怎样证明优化有收益?
- 什么时候ref或state才是正确工具?
技术参考
- React useMemo:技术语义参考,具体题目按本文约定。
