likes
comments
collection
share

在 React 中什么是 memoization?

作者站长头像
站长
· 阅读数 5

在 React 中什么是 memoization?

Memoization 是一种强大的优化技术,用于通过缓存昂贵函数调用的结果来提高应用程序的性能。它可以提供显著的性能改进。在本文中,我们将探讨 Memoization 的基础知识,它的工作原理,以及如何通过代码示例将其应用于您的 TypeScript 和 ReactJS 项目。

什么是Memoization?

Memoization 是一种通过缓存那些函数调用的结果来优化昂贵函数调用的技术。当使用一组特定的输入调用函数时,该函数的输出存储在缓存中。

下次使用相同的输入调用该函数时,将返回缓存的输出,而不是重新计算输出。这可以显著减少执行函数所需的时间,并提高应用程序的性能。

Memoization 是如何工作的?

Memoization 的工作原理是将函数调用的结果存储在缓存中。缓存通常作为对象实现,其中键是函数输入,值是相应的函数输出。当调用函数时,将使用输入来查找缓存的输出。如果在缓存中找到输出,则返回它。如果在缓存中没有找到输出,则执行该函数,并将输出存储在缓存中以供将来使用。

在TypeScript和ReactJS中应用Memoization

在TypeScript和ReactJS中应用记忆是相对简单的。有几个库提供了记忆功能,比如Lodash的memoize函数,ReactJS的reselect或hooks。这些库可以使用NPM或Yarn安装,并在TypeScript和ReactJS项目中使用。

使用 reselect 库

下面是一个如何在ReactJS组件中使用reselect库来使用记忆的示例。如果使用Redux toolkit包,则默认包含“reselect”。

import { createSelector } from 'reselect';

const getExpensiveData = (state) => state.expensiveData;

const getMemoizedData = createSelector([getExpensiveData], (expensiveData) => {
  // Expensive computation here
  return expensiveData.map((item) => item * 2);
});

function MyComponent(props) {
  const memoizedData = useSelector(getMemoizedData);

  return (
    <div>
      {memoizedData.map((item) => (
        <div key={item}>{item}</div>
      ))}
    </div>
  );
}

在本例中,我们使用reselect库来创建一个记忆选择器,该选择器计算一些昂贵的数据。

getExpensiveData函数从Redux存储中选择昂贵的数据,getMemoizedData函数使用reselect中的createSelector函数计算昂贵的数据。

createSelector函数接受一个输入选择器数组和一个计算记忆值的结果函数。然后使用useSelector钩子从Redux存储中选择记忆数据,并在组件中呈现它。

使用useMemo钩子

下面是一个如何使用钩子在React组件中使用记忆的例子。

import React, { useState, useMemo } from 'react';

const MyComponent = () => {
  const [count, setCount] = useState(0);

  const expensiveComputation = (num: number) => {
    console.log('Computing...');
    return num ** 2;
  };

  // memoize the expensiveComputation function
  const memoizedComputation = useMemo(() => expensiveComputation(count), [count]);

  return (
    <div>
      <h1>Memoization Example</h1>
      <p>Count: {count}</p>
      <p>Computed value: {memoizedComputation}</p>
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
    </div>
  );
};

export default MyComponent;

在这个例子中,一个简单的React组件使用useState钩子来维护一个count变量。我们还有一个名为expensivcompute的函数,它接受一个数字作为参数并返回它的平方。为了记忆昂贵的计算函数,我们使用了useMemo钩子。useMemo钩子接受两个参数:一个用于记忆的函数和一个依赖项数组。在本例中,我们记住了昂贵的计算函数,只有在count变量改变时才重新计算它的结果。

通过使用useMemo,我们可以防止昂贵的计算不必要的重新计算,提高我们的组件的性能。总的来说,memoization是一个强大的工具,可以提高TypeScript和ReactJS应用程序的性能,使用像useMemo这样的钩子可以很容易地在组件中实现memoization。在React组件中使用memoization的另一种方法是使用useCallback钩子。useCallback钩子可以用来memoize一个函数,防止不必要的组件重新呈现。

例子:

import React, { useState, useCallback } from 'react';

const MyComponent = () => {
  const [count, setCount] = useState(0);

  // memoize the handleClick function
  const handleClick = useCallback(() => {
    console.log('Clicked!');
  }, []);

  return (
    <div>
      <h1>Memoization Example</h1>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
      <button onClick={handleClick}>Click Me</button>
    </div>
  );
};

export default MyComponent;

在这个例子中,我们使用useCallback钩子来记忆handleClick函数。useCallback钩子接受两个参数:一个要记忆的函数和一个依赖项数组。在本例中,我们记忆handleClick函数并提供一个空数组作为依赖项,这意味着该函数只会被记忆一次。通过使用useCallback,我们可以防止不必要的组件重新呈现,这可以提高性能。在React应用程序中,Memoization是一个强大的工具,使用像useCallback这样的钩子可以很容易地在组件中实现Memoization。

在TypeScript和ReactJS中memoization的好处

在TypeScript和ReactJS项目中使用memoization有以下几个好处:

  1. 提高性能:memoization可以通过减少昂贵的函数调用数量来显著提高应用程序的性能。
  2. 减少重新渲染:Memoization还可以减少ReactJS组件中重新渲染的次数,因为当输入数据没有改变时,它可以防止不必要的渲染。
  3. 更简洁的代码:记忆还可以产生更简洁的代码和更模块化的代码。通过将计算逻辑与呈现逻辑分离,您可以创建更加模块化和可重用的代码。
  4. 可伸缩性:随着应用程序的增长和变得越来越复杂,记忆可以通过防止不必要的重新计算来帮助您维护性能和可伸缩性。
  5. 更容易调试:通过提供函数结果的缓存,记忆可以使调试更容易,从而更容易识别代码中的潜在问题。

计算开销大且很有可能使用相同的输入重复调用的函数是memoization的好选择。memoization会增加内存使用量,并给代码带来复杂性。明智地使用memoization非常重要,而且只在它能提供显著性能优势的情况下使用。

结论

Memoization是一种强大的优化技术,可以显著提高TypeScript和ReactJS应用程序的性能。通过缓存昂贵的函数调用的结果,可以减少计算次数并提高应用程序的可伸缩性。

借助像reselect这样的库,Memoization可以很容易地在TypeScript和ReactJS项目中实现。但是,必须谨慎地使用Memoization,并且只在它能提供显著性能优势的情况下使用。有了提高性能、减少重复渲染、更干净的代码和可伸缩性的好处,Memoization绝对值得你在TypeScript和ReactJS项目中考虑。

转载自:https://juejin.cn/post/7353245651591610418
评论
请登录