useMemo、useCallback、memo 是否都要加

先理解原理和示例,再练习完整口述与追问。

缓存结果、引用、组件;收益必须大于维护成本。

memo 缓存组件在可跳过条件下的渲染,useMemo 缓存一次计算结果,useCallback 缓存函数引用。它们解决不同层面的重复工作;依赖数组中的值仍按 Object.is 等规则比较。memo 组件自己的 state 或所读 Context 变化仍会使它更新,父传入每次新建的对象也可能让浅比较无法命中。

大表格行只接收稳定 row 与 onSelect,可以先用 Profiler 看是否因无关父更新频繁执行;真正昂贵的排序可用 useMemo 缓存。若 onSelect 每次重新创建导致 memo 行更新,再根据需要用 useCallback;只给一个便宜按钮包多层缓存,比较与维护成本可能更高。

缓存是性能优化,不能依赖它维持正确性或保存必须可靠存在的业务状态。自定义比较函数若漏了函数 prop,可能让子组件继续使用旧闭包。

useMemo 缓存计算结果,useCallback 缓存函数引用,memo 用 props 比较跳过部分父更新引发的渲染。便宜计算没必要都缓存,不稳定的新对象可能让缓存失效,自身 state 与 Context 变化仍可更新组件。先测瓶颈,再用稳定输入和合适粒度优化,不以加 Hook 数量当性能成果。