React- useMemo & useCallback

在React中,useMemouseCallback 是两个非常有用的Hooks,它们可以帮助我们优化组件的性能,避免不必要的计算和函数重新定义。下面我会详细讲解它们的使用场景、如何验证效果以及避免不必要的计算。

什么时候用 useMemo

useMemo 用于缓存计算结果,当依赖项没有变化时,避免重复计算。它特别适用于以下场景:

  1. 复杂的计算 :当计算过程非常耗时或复杂时,使用 useMemo 可以缓存计算结果,避免每次渲染都重新计算。
  2. 传递给子组件的值 :如果一个计算结果被传递给子组件作为props,而子组件依赖于这个值进行渲染,使用 useMemo 可以避免子组件不必要的重新渲染。

什么时候用 useCallback

useCallback 用于缓存函数,当依赖项没有变化时,避免函数的重新定义。它特别适用于以下场景:

  1. 作为子组件的props :当一个函数被传递给子组件作为props,而子组件依赖于这个函数进行渲染,使用 useCallback 可以避免子组件不必要的重新渲染。
  2. 事件处理函数 :当一个事件处理函数依赖于某些状态或props,使用 useCallback 可以避免每次渲染都重新定义这个函数。

如何验证效果

要验证 useMemouseCallback 的效果,可以通过以下几种方式:

  1. 控制台日志:在计算函数或事件处理函数中添加控制台日志,观察它们的调用次数。
  2. React DevTools:使用React DevTools查看组件的渲染次数,观察是否减少了不必要的渲染。
  3. 性能分析工具:使用浏览器的性能分析工具,观察页面的渲染性能是否有提升。

示例代码

下面是一个更详细的示例,展示了如何使用 useMemouseCallback,以及如何验证它们的效果:

jsx 复制代码
import React, { useState, useMemo, useCallback } from 'react';

function ExpensiveCalculation({ count }) {
  console.log('ExpensiveCalculation called');
  return count * 2;
}

function ChildComponent({ handleClick }) {
  console.log('ChildComponent rendered');
  return (
    <button onClick={handleClick}>Increment</button>
  );
}

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

  const expensiveCalculation = useMemo(() => {
    console.log('ExpensiveCalculation computed');
    return ExpensiveCalculation({ count });
  }, [count]);

  const handleClick = useCallback(() => {
    console.log('handleClick called');
    setCount(count + 1);
  }, [count]);

  return (
    <div>
      <ChildComponent handleClick={handleClick} />
      <div>Result: {expensiveCalculation}</div>
    </div>
  );
}

export default ParentComponent;

验证效果

  1. 控制台日志 :在控制台中观察 ExpensiveCalculation calledChildComponent rendered 的输出次数,确保它们只在 count 变化时才被调用。
  2. React DevTools :使用React DevTools查看 ChildComponent 的渲染次数,确保它没有不必要的重新渲染。
  3. 性能分析工具:使用浏览器的性能分析工具,观察页面的渲染性能是否有提升。

通过以上方法,我们可以验证 useMemouseCallback 的效果,确保它们有效地避免了不必要的计算和函数重新定义。

相关推荐
fei_sun26 分钟前
黑洞路由(Null Route/空接口路由)
服务器·前端·javascript
大爱一家盟38 分钟前
告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐
大数据·前端·人工智能
彦为君41 分钟前
算法思维与经典智力题
java·前端·redis·算法
aa小小1 小时前
localhost 访问异常排查笔记
前端
格子软件1 小时前
2026年GEO优化系统源码的分布式状态机深度拆解
java·前端·vue.js·vue·geo
陈随易2 小时前
Rust、Golang、MoonBit 编译成 WASM,体积和速度差距有多大?
前端·后端·程序员
IT_陈寒2 小时前
Python多线程的坑,我居然现在才踩到
前端·人工智能·后端
触底反弹3 小时前
🔥 字符串算法面试三连击:反转、回文、回文变种,搞懂这三题稳了!
前端·javascript·算法
竹林8183 小时前
从 RPC 超时到批量签名:我用 @solana/web3.js 重构了一个 NFT 铸造页面,踩了这些坑
前端·javascript
工业HMI实战笔记3 小时前
工业HMI界面布局“1核2辅”黄金结构,适配90%场景
前端·ui·性能优化·自动化·交互