React.memo 和 memoize 函数的区别

React.memo 和 JavaScript memoize 函数在缓存机制和使用场景上的差异

问题

React.memo 和 JavaScript 的 memoize 函数有什么区别?

解答

React.memo 和 memoize 函数都用于缓存结果以提升性能,但它们的设计目标和实现方式不同。

适用范围

React.memo 是 React 提供的高阶组件,专门用于优化函数组件的渲染性能:

const MyComponent = React.memo(function MyComponent(props) {
  return <div>{props.value}</div>;
});

memoize 函数是通用的 JavaScript 函数缓存工具,可用于任何函数:

function memoize(fn) {
  const cache = {};
  return function(...args) {
    const key = JSON.stringify(args);
    if (cache[key]) return cache[key];
    const result = fn.apply(this, args);
    cache[key] = result;
    return result;
  };
}

const expensiveCalculation = memoize((a, b) => {
  return a * b * Math.random();
});

缓存策略

React.memo 通过浅比较 props 决定是否重新渲染,只比较第一层属性:

// 只有当 props.name 或 props.age 改变时才重新渲染
const User = React.memo(({ name, age }) => {
  return <div>{name} - {age}</div>;
});

memoize 函数将参数序列化为字符串作为缓存键,对于复杂对象需要自定义键值计算:

// 基本类型参数可以直接缓存
const add = memoize((a, b) => a + b);

// 对象参数需要自定义缓存策略
const customMemoize = (fn, keyGenerator) => {
  const cache = new Map();
  return function(...args) {
    const key = keyGenerator(args);
    if (cache.has(key)) return cache.get(key);
    const result = fn.apply(this, args);
    cache.set(key, result);
    return result;
  };
};

应用场景

React.memo 适合优化渲染不频繁的组件:

// 列表项组件,props 不常变化
const ListItem = React.memo(({ id, title }) => {
  return <li>{title}</li>;
});

memoize 函数适合缓存计算密集型操作:

// 斐波那契数列计算
const fibonacci = memoize((n) => {
  if (n <= 1) return n;
  return fibonacci(n - 1) + fibonacci(n - 2);
});

关键点

  • React.memo 是 React 高阶组件,用于优化组件渲染;memoize 是通用函数缓存工具
  • React.memo 使用浅比较 props,memoize 通过参数序列化生成缓存键
  • React.memo 适合优化纯组件,memoize 适合缓存耗时计算
  • React.memo 可传入自定义比较函数,memoize 可自定义键值生成策略