React.memo、useMemo、useCallback

115 阅读2分钟

React.memo

React.memo是一个高阶组件,用于优化函数组件的性能。它通过记忆组件渲染输出,避免在相同的props下重复渲染组件。

工作原理:

  • React.memo接受一个组件并返回一个新组件,该组件只有在props改变时才会重新渲染。
  • 默认情况下,它对props进行浅比较。
  • 可以提供一个自定义的比较函数来更精确地控制重新渲染的行为。
import React from 'react';

const MyComponent = React.memo(
  (props) => {
    // 组件逻辑
    return <div>{props.value}</div>;
  },
  (prevProps, nextProps) => {
    // 自定义比较函数
    return prevProps.value === nextProps.value;
  }
);

useMemo

useMemo是一个React Hook,用于记忆一个函数的计算结果。它帮助避免在每次渲染时重新计算那些代价高昂的计算。

工作原理:

  • useMemo接受一个函数和一个依赖项数组。
  • 只有在依赖项发生变化时才会重新计算memoized值。
  • 用于优化性能,通过记忆那些代价高昂的计算或操作的结果。
import React, { useMemo } from 'react';

const MyComponent = (props) => {
  const memoizedValue = useMemo(() => {
    // 代价高昂的计算
    return computeExpensiveValue(props.input);
  }, [props.input]);

  return <div>{memoizedValue}</div>;
};

useCallback

useCallback是一个React Hook,用于记忆一个回调函数。它帮助避免在每次渲染时创建新的回调函数,从而防止不必要的重新渲染。

工作原理:

  • useCallback接受一个回调函数和一个依赖项数组。
  • 只有在依赖项发生变化时才会返回一个新的回调函数。
  • 用于优化性能,通过记忆那些不需要每次渲染都重新创建的回调函数。
import React, { useCallback } from 'react';

const MyComponent = (props) => {
  const memoizedCallback = useCallback(() => {
    // 回调逻辑
    doSomething(props.input);
  }, [props.input]);

  return <button onClick={memoizedCallback}>Click me</button>;
};

区别和使用场景

  • React.memo:用于防止函数组件在相同的props下重新渲染。它适用于记忆整个组件的渲染结果。
  • useMemo:用于防止在每次渲染时重新计算那些代价高昂的计算结果。它适用于记忆组件内部某些代价高昂的计算或派生状态。
  • useCallback:用于防止在每次渲染时重新创建回调函数。它适用那些不需要每次重新创建的回调函数,从而防止因回调函数变化而导致的子组件重新渲染。