useMemo和react.memo有什么区别

97 阅读2分钟

前端学习笔记

🧑‍💻 有点意思

useMemo和react.memo有什么区别,适合在哪里使用


🤖 Assistant

useMemoReact.memo都是React性能优化工具,但用途和使用场景有本质区别:


一、核心区别

React.memouseMemo
用途组件级渲染缓存值计算结果缓存
应用对象函数组件组件内部的具体计算值
触发条件Props变化时触发重渲染依赖项变化时重新计算值
对比方式默认浅对比props / 可自定义对比函数依赖数组浅对比

二、React.memo(组件级优化)

const MyComponent = React.memo(({ data }) => {
  return <div>{data}</div>;
}, arePropsEqual?);

核心作用:缓存组件渲染结果,避免不必要的重渲染
适用场景

  1. 父组件频繁re-render但子组件props未变化
  2. 渲染开销较大的展示型组件(如复杂表格、图表)
  3. 当Props中包含非原始类型时(建议结合useMemo/useCallback使用)

特点

  • 默认使用浅比较(shallow compare)props
  • 可自定义比较函数作为第二个参数
  • 类组件对应的是PureComponent

三、useMemo(值级优化)

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

核心作用:缓存高开销计算的结果
适用场景

  1. 复杂数据转换/计算(如大数据排序/过滤)
  2. 避免因re-render重复生成新对象引用(配合React.memo使用)
  3. 优化复杂动画计算值
  4. 需要稳定引用但依赖某些计算的变量

特点

  • 在渲染阶段同步执行(不要包含副作用)
  • 依赖数组使用Object.is比较
  • 类似于Vue的computed属性

四、配合使用最佳实践

// 数据获取时配合使用
const UserList = React.memo(({ users }) => {
  const filteredUsers = useMemo(() => 
    users.filter(u => u.active), 
  [users]); // ✅ users数组引用不变时直接返回缓存

  return (
    <List items={filteredUsers} />
  );
});

// 函数组件优化组合拳
const DataTable = React.memo(({ data }) => {
  const processedData = useMemo(() => 
    heavyProcessing(data), 
  [data]);

  return <Table data={processedData} />;
});

五、使用原则

  1. 优先考虑渲染优化:先用React.memo优化组件层级结构
  2. 值类型优化后续进行:在组件内部使用useMemo优化具体计算
  3. 注意隐性成本:缓存本身需要内存和比较开销
  4. 引用稳定:当需要将memoized值作为其他Hook的依赖项时,必须用useMemo保证引用稳定

六、性能优化金字塔(推荐优化顺序)

  1. 正确的组件拆分(高内聚低耦合)
  2. 合理的React.memo使用
  3. 必要时的useMemo/useCallback优化
  4. 终极手段:shouldComponentUpdate(类组件)

通过组合使用这些优化工具,可以在保持代码可维护性的同时,显著提升React应用性能。但要注意避免过度优化——只有实际遇到性能瓶颈时再进行针对性优化才是最佳实践。