useMemo详解

14 阅读2分钟

useMemo 是 React 提供的一个 Hook,用于缓存计算结果,避免每次组件渲染时都重复执行复杂或耗时的计算,从而提升性能。

基本用法

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
  • 第一个参数:返回要缓存的计算结果的函数(通常是复杂或昂贵的计算)。
  • 第二个参数:依赖项数组,只有当数组中的依赖发生变化时,useMemo 才会重新执行计算函数,否则直接返回上一次缓存的结果。

工作原理

  • 每次组件渲染时,React 会检查依赖项数组中的值是否发生变化。
  • 只有依赖项发生变化时,useMemo 才会重新执行计算函数,否则直接返回上一次缓存的值。
  • 这不仅节省了计算资源,还能保证引用的一致性,避免因引用变化导致的子组件不必要的重新渲染。

适用场景

  • 复杂、耗时的计算:如大数据的过滤、排序、图表数据生成等。
  • 保持引用稳定:如将对象或数组作为 props 传递给子组件时,避免因引用变化导致子组件重复渲染。

注意事项

  • 依赖项数组要准确:如果依赖项写漏,可能导致缓存结果不是最新的,产生 bug。
  • 不要滥用:仅在性能瓶颈或引用频繁变化导致子组件重复渲染时使用。过度使用会增加代码复杂度。
  • 缓存的是“值” ,不是“函数”。如果要缓存回调函数,应该用 useCallback。

示例

function ProductList({ products, filter }) {
  // 只在 products 或 filter 变化时重新计算 filteredProducts
  const filteredProducts = useMemo(() => {
    return products.filter(product => product.name.includes(filter));
  }, [products, filter]);

  return (
    <ul>
      {filteredProducts.map(product => (
        <li key={product.id}>{product.name}</li>
      ))}
    </ul>
  );
}

与 useCallback 的区别

Hook作用返回内容
useMemo缓存计算结果记忆化的值
useCallback缓存函数引用记忆化的函数

总结

useMemo 通过依赖项数组缓存计算结果,提升性能并保持引用一致性,适合用于复杂计算和优化子组件渲染。