首页  >  文章  >  web前端  >  理解 `useMemo` 和 `useCallback`:综合指南

理解 `useMemo` 和 `useCallback`:综合指南

PHPz
PHPz原创
2024-08-28 06:11:06212浏览

Understanding `useMemo` and `useCallback`: A Comprehensive Guide

useMemo 和 useCallback 是两个强大的 React hook,它们在防止不必要的重新渲染方面发挥着至关重要的作用,从而优化组件性能。它们是开发人员创建响应迅速且高效的 React 应用程序的必备工具。

在本指南中,我们将深入解释 useMemo 和 useCallback 的相似之处以及彼此之间的区别。我们将了解如何实施它们,何时使用每一个。

为什么要使用 useMemo 或 useCallback

通常在React中大多数计算都很快,但有时你会对非常大的数组进行计算,或者一些不需要在每次重新渲染时执行的昂贵计算。

useMemo 和 useCallback 钩子可以通过缓存重新渲染之间那些昂贵的计算来帮助解决这个问题。

什么是 useMemo 以及如何使用它。

useMemo 是 React hook,它缓存重新渲染之间的计算结果,它需要两个参数:

  • CalculatedValue:计算要缓存的值的函数。该函数不应接受任何参数,并且应该是纯函数,并返回任何类型的值。如果依赖关系没有改变,React 会返回相同的计算结果,否则会计算一个新的结果并缓存。
  • 依赖项:CalculatedValue 中所有反应值引用的列表,来自状态变量常量和函数调用。 React 将尝试使用 Object.it 比较将每个反应值与其先前的值进行比较。

useMemo 用法

要缓存重新渲染之间的计算,请将其包装在组件顶层的 useMemo 挂钩。

useMemo(fn, 依赖项)

const App = () => {
  const useMemo(() => {
    filterTodo(todos, tab)
  }, [todos, tab])
  return(...)
}

export default App

注意 useMemo 的第一个参数是一个没有参数的函数。

第一次React会计算useMemo第一个参数的结果值,然后记住第二个参数,即依赖项列表。 React 会在重新渲染之间缓存计算结果,并且仅当其中一个依赖项值发生变化时才重新计算结果。

什么是 useCallback 以及如何使用它。

useCallback 钩子与 useMemo 钩子相同,唯一的区别是该钩子将缓存函数(useCallback 的第一个参数)而不计算值。该函数还可以接受与 useMemo 不同的参数。

要使用useCallback,您需要传递参数:

  • 需要缓存的函数定义。
  • 依赖项列表

const cachedFn = useCallback(fn, dependency)

import { useCallback } from 'react';

export default function ProductPage({ productId }) {
  const handleSubmit = useCallback((orderDetails) => {
    post('/product/' + productId + '/buy', {
      referrer,
      orderDetails,
    });
  }, [productId, referrer]);

何时使用 useMemo 而不是 useCallback

如果您主要关心优化计算结果,请使用 useMemo。
如果您主要关心的是防止由于函数更改而导致不必要的重新渲染,请使用 useCallback。

跳过组件的重新渲染

有时你会有一个需要重新渲染的父组件,这也会导致子组件的重新渲染。可以使用备忘录来缓存组件。

假设我们有一个具有主题状态的 Todolist 组件,以及一个作为子组件的 List 组件。每当主题状态更改时,列表组件都会重新渲染,这是不必要的。要解决这个问题,请使用备忘录。

我们用 memo 包装 List 的功能组件。

export default function TodoList({ todos, tab, theme }) {
  // ...
  return (
    <div className={theme}>
      <List items={visibleTodos} />
    </div>
  );
}
import { memo } from 'react';

const List = memo(function List({ items }) {
  // ...
});

结论

在这篇综合指南中,我们了解了 useMemo 和 useCallback 钩子,如何使用它们,何时使用它们,并解释了它们对于优化 React 应用程序性能的好处。

以上是理解 `useMemo` 和 `useCallback`:综合指南的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn