useMemo——提高React性能的利器

一、什么是useMemo

React中提供了一种优化组件性能的钩子函数——useMemo。它可以帮助我们避免在每次渲染时都执行的昂贵计算。

useMemo钩子函数接收两个参数:计算函数和依赖项数组。计算函数会在渲染期间执行,依赖项数组中的值是用来比较的,如果某个依赖项发生变化,useMemo会重新计算数值。否则,它将返回上一次计算结果的值。

示例代码:

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

二、如何使用useMemo

1、需要优化渲染的函数

因为useMemo是一个可以计算复杂值的钩子函数,所以只有当你的组件渲染的元素个数非常多或者需要进行复杂计算时,你才需要使用useMemo来进行性能优化。

示例代码:

  function App() {
    const arr = [1,2,3,4,5];
    const memoizedArr = useMemo(() => {
      return arr.map(item => item * item)
    }, [arr]);

    return (
      <div>
        <ul>
          {memoizedArr.map(item => <li>{item}</li>)}
        </ul>
      </div>
    );
  }

2、依赖项数组使用

useMemo的第二个参数中传递的是一个依赖项数组。这个数组中传递的值会在每次渲染时与上次的值进行比较。只有当它们不同时,useMemo才会重新计算数值。

示例代码:

  function App2() {
    const [count, setCount] = useState(0);

    const memoizedValue = useMemo(() => {
      const sum = Array.from({ length: count }, (_, index) => index + 1).reduce((a, b) => {
        return a + b;
      });
      return sum;
    }, [count]);

    return (
      <div>
        <h3>count:{count}</h3>
        <button onClick={() => setCount(count + 1)}>add count</button>
        <span>memoizedValue:{memoizedValue}</span>
      </div>
    );
  }

3、将useMemo用在useEffect中

useMemo还可以用来优化像useEffect这样的副作用钩子函数。下面的示例展示了如何使用useMemo来减少不必要的渲染。

示例代码:

  function App3() {
    const [count, setCount] = useState(0);
    const [step, setStep] = useState(1);

    const memoizedValue = useMemo(() => ({ count }), [count]);

    useEffect(() => {
      console.log('count:', count);
    }, [memoizedValue]);

    return (
      <div>
        <h3>count:{count}</h3>
        <h3>step:{step}</h3>
        <button onClick={() => setCount(count + step)}>add count</button>
        <button onClick={() => setStep(step + 1)}>add step</button>
      </div>
    );
  }

三、useMemo使用的常见错误

1、忽略依赖项

为了使useMemo正常工作,必须在第二个参数中传递所有相关的依赖项。如果忽略了一个重要的依赖项,则useMemo将不会执行预期的更新操作。

示例代码:

  function App4() {
    const [count, setCount] = useState(0);
    const [step, setStep] = useState(1);

    const memoizedValue = useMemo(() => {
      const sum = Array.from({ length: count }, (_, index) => index + 1).reduce((a, b) => {
        return a + b;
      });
      return sum;
    }, []); // 这里忽略了count,所以memoizedValue永远不会变化

    return (
      <div>
        <h3>count:{count}</h3>
        <h3>step:{step}</h3>
        <button onClick={() => setCount(count + step)}>add count</button>
        <button onClick={() => setStep(step + 1)}>add step</button>
        <span>memoizedValue:{memoizedValue}</span>
      </div>
    );
  }

2、过度使用useMemo

虽然useMemo可以优化组件的性能,但是过度使用它会导致代码更加复杂。有时候,完全没有必要优化某些计算,因为它们的成本非常低。

示例代码:

  function App5() {
    const [count, setCount] = useState(0);

    // count的平方数
    const memoizedValue = useMemo(() => {
      return count ** 2;
    }, [count]);

    // 仅仅只是count的显示
    const memoizedValue2 = useMemo(() => {
      return `count:${count}`;
    }, [count]);

    return (
      <div>
        <h3>{memoizedValue2}</h3>
        <p>memoizedValue:{memoizedValue}</p>
        <button onClick={() => setCount(count + 1)}>add count</button>
      </div>
    );
  }

四、总结

useMemo是一个非常有用的钩子函数,可以帮助我们在React应用程序中提高性能。但是,如果不适当地使用它,会导致代码变得更加难以阅读和理解。因此,在使用useMemo之前,请仔细考虑您要优化的值是否真的太昂贵,是否需要优化。

原创文章,作者:IDOCK,如若转载,请注明出处:https://www.506064.com/n/371633.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
IDOCKIDOCK
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相关推荐

  • @uiw/react-amap介绍

    本文将详细阐述@uiw/react-amap的使用方法和参数配置,以及如何在React应用中集成高德地图组件。 一、@uiw/react-amap简介 @uiw/react-ama…

    编程 2025-04-29
  • lsw2u1:全能编程开发工程师的利器

    lsw2u1是一款多功能工具,可以为全能编程开发工程师提供便利的支持。本文将从多个方面对lsw2u1做详细阐述,并给出对应代码示例。 一、快速存取代码段 在日常开发中,我们总会使用…

    编程 2025-04-29
  • Python刷课:优化学习体验的利器

    Python刷课作为一种利用自动化技术优化学习体验的工具已经被广泛应用。它可以帮助用户自动登录、自动答题等,让用户在学习过程中可以更加专注于知识本身,提高效率,增加学习乐趣。 一、…

    编程 2025-04-29
  • 如何优化 Git 性能和重构

    本文将提供一些有用的提示和技巧来优化 Git 性能并重构代码。Git 是一个非常流行的版本控制系统,但是在处理大型代码仓库时可能会有一些性能问题。如果你正在处理这样的问题,本文将会…

    编程 2025-04-29
  • 使用@Transactional和分表优化数据交易系统的性能和可靠性

    本文将详细介绍如何使用@Transactional和分表技术来优化数据交易系统的性能和可靠性。 一、@Transactional的作用 @Transactional是Spring框…

    编程 2025-04-28
  • HBuilder2.0:一站式开发利器

    本文将从如下几个方面对HBuilder2.0进行详细阐述,帮助初学者快速了解并开始使用该工具: 一、简介 HBuilder2.0是一个跨平台的HTML5集成开发工具。它综合了编码、…

    编程 2025-04-28
  • Python性能优化方案

    本文将从多个方面介绍Python性能优化方案,并提供相应的示例代码。 一、使用Cython扩展 Cython是一个Python编译器,可以将Python代码转化为C代码,可显著提高…

    编程 2025-04-28
  • Powersploit:安全评估与渗透测试的利器

    本文将重点介绍Powersploit,并给出相关的完整的代码示例,帮助安全人员更好地运用Powersploit进行安全评估和渗透测试。 一、Powersploit简介 Powers…

    编程 2025-04-28
  • JL Transaction – 实现分布式事务管理的利器

    本文将为大家介绍JL Transaction,这是一款可以实现分布式事务管理的开源事务框架,它可以帮助企业在分布式环境下有效地解决事务的一致性问题,从而保障系统的稳定性和可靠性。 …

    编程 2025-04-28
  • Python AUC:模型性能评估的重要指标

    Python AUC是一种用于评估建立机器学习模型性能的重要指标。通过计算ROC曲线下的面积,AUC可以很好地衡量模型对正负样本的区分能力,从而指导模型的调参和选择。 一、AUC的…

    编程 2025-04-28

发表回复

登录后才能评论