Use Memo

useMemo: 用于缓存计算结果,避免重复计算,类似于 shouldComponentUpdate 生命周期。和vue的计算属性类似

计算量大的方法

 const [text, setText] = useState("");
  const [number, setNumber] = useState(0);

  const expensiveFunction = (n) => {
    console.log("方法开始!");
    let total = 0;
    for (let i = 1; i <= n; i++) {
      total += i;
    }
    return total;
  };
  // 依赖number
  const sum = useMemo(() => expensiveFunction(number), [number]);

  console.log("组件渲染!");
  // 结果 方法开始!-》 组件渲染!

  return (
    <div>
      <input
        onChange={(e) => setText(e.target.value)}
        placeholder="enter a text"
      />
      <input
        type="number"
        value={number}
        onChange={(e) => setNumber(e.target.value)}
      />
      <span>Total: {sum}</span>
    </div>
  );

useMemo VS useEffect

计算量大的组件与同级组件完全解耦

计算量大的组件通过组件参数传递传递

缓存组件 useMemo vs React.memo

React.memo vs useMemo

React.memo 用于对组件进行浅层比较,适用于优化组件的渲染性能,特别是当组件的渲染代价较高时,避免不必要的重新渲染。React.memo 适用于优化组渲染性能,特别是当组件的渲染代价较高时。React.memo 接受两个参数,第一个参数 Component 原始组件本身,第二个参数 compare 是一数,第二个参数不存在时,会浅层比较处理 props。

  • useMemo 则是一个 Hook,用于缓存计算结果,避免重复计算。useMemo 接受两个参数,第一个参数是一个函数,用于进行计算;第二个参数是一个依赖数组,只有依赖数组中的值发生变化时,才会重新计算并返回计算结果。因此,useMemo 适用于优化计算性能,特别是当计算代价较高时。

  • React.memo 和 useMemo 的作用虽然不同,但它们都是基于浅层比较的,因此只能比较 props 或依赖数组中的简单类型值。如果 props 或依赖数组中包含复杂类型值(如对象或数组),则需要自行实现比较逻辑,否则可能会导致不正确的渲染结果或缓存结果。

useMemo vs useCallback

  • useCallback 用于缓存函数,记忆的是函数内存地址。而 useMemo 用于缓存第一个函数运算结果。

Last updated