react Hooks之useMemo、useCallback

一、useMemo

1、作用:

用于对值的计算进行缓存,以避免重复计算。它可以帮助优化性能,特别是在处理昂贵的计算操作时非常有用。如何可以对比的话,我猜应该和vue中的计算属性差不多吧。

2、用法:

在使用 useMemo 时,你需要传入一个计算函数和一个依赖项数组作为参数。useMemo 会返回计算函数的结果,并且只有当依赖项发生变化时才会重新计算值,否则将返回上一次缓存的值。

3、示例:

javascript 复制代码
import { useMemo } from 'react';

function Example({ data }) {
  const expensiveValue = useMemo(() => {
    // 进行昂贵的计算操作
    let result = 0;
    for (let i = 0; i < data.length; i++) {
      result += data[i];
    }
    return result;
  }, [data]); // 依赖项为 data

  return <div>Expensive value: {expensiveValue}</div>;
}

在这个示例中,我们使用了 useMemo 来缓存一个计算结果 expensiveValue。每当 data 发生变化时,useMemo 中的计算函数将被调用以重新计算 expensiveValue。如果 data 没有发生变化,useMemo 将返回上一次缓存的值,而不会重新计算。

这样做可以有效地避免在每次渲染时都进行昂贵的计算操作,从而提高应用程序的性能。

二、useCallback

1、作用:

用于缓存函数的引用,以避免在每次渲染时都创建新的函数。

2、用法:

useCallback 接受一个函数和一个依赖项数组作为参数,并返回一个缓存的函数引用。

3、示例:

javascript 复制代码
import { useState, useCallback } from 'react';

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

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

  return (
    <div>
      <div>Count: {count}</div>
      <button onClick={handleClick}>Increase</button>
    </div>
  );
}

在这个示例中,我们使用 useState 来维护一个计数器 count。然后,我们使用 useCallback 缓存了一个处理点击事件的函数 handleClick

每当点击 "Increase" 按钮时,handleClick 函数会被调用,并且 count 会增加。由于我们使用了 useCallback 缓存了 handleClick 函数,它在每次渲染时都保持相同的引用,这样不会导致子组件的不必要重新渲染。

所以,通过使用 useCallback,我们可以优化函数的性能,并避免不必要的重新渲染。

对比总结一下:

useMemo

  • 用于缓存值,避免重复计算。
  • 接收一个计算函数和依赖项数组作为参数。
  • 在组件重新渲染时,只有依赖项发生变化时才会重新计算值,否则返回上一次缓存的值。
  • 常用于优化昂贵的计算操作,例如处理大量数据或复杂的计算逻辑

useCallback

  • 用于缓存函数,避免函数在每次渲染时重新创建。
  • 接收一个回调函数和依赖项数组作为参数。
  • 在组件重新渲染时,只有依赖项发生变化时才会重新创建函数,否则返回上一次缓存的函数。
  • 常用于优化父组件向子组件传递的回调函数,以及避免子组件的不必要重新渲染。

总结:

当需要缓存并重复使用计算结果时,使用 useMemo
当需要缓存并重复使用函数时,使用 useCallback
在两者的依赖项数组中,都应该列出所有影响结果或函数创建的依赖项。

注意事项:

1、使用条件:useMemouseCallback 都用于优化性能,避免不必要的重复计算或函数重新创建。因此,只有在有必要时才使用它们,而不是滥用。

2、依赖数组:useMemouseCallback 都接受一个依赖数组作为参数。该数组用于指定在依赖项发生变化时才重新计算或重新创建。务必小心地指定依赖项,确保只有当这些依赖项发生变化时才触发重新计算或重新创建。如果不指定依赖项数组,它们将在每次渲染时都重新计算或重新创建。

3、对象和函数的引用:useMemouseCallback 会根据依赖项是否发生变化来判断是否重新计算或重新创建返回值。对于对象和函数,它们使用的是引用比较。如果依赖项中包含对象或函数,并且其引用未发生变化,那么 useMemouseCallback 将返回之前的缓存值,而不会重新计算或重新创建。

4、性能优化:useMemouseCallback 的目的是进行性能优化。但是过度使用它们可能会导致代码复杂性增加,降低代码可读性。只有当你确实遇到了性能问题,并且经过测试证明使用这些 Hook 可以提升性能时,才值得使用它们

相关推荐
qq_177767371 分钟前
React Native鸿蒙跨平台数据使用监控应用技术,通过setInterval每5秒更新一次数据使用情况和套餐使用情况,模拟了真实应用中的数据监控场景
开发语言·前端·javascript·react native·react.js·ecmascript·harmonyos
烬头88214 分钟前
React Native鸿蒙跨平台应用实现了onCategoryPress等核心函数,用于处理用户交互和状态更新,通过计算已支出和剩余预算
前端·javascript·react native·react.js·ecmascript·交互·harmonyos
2601_949593652 小时前
基础入门 React Native 鸿蒙跨平台开发:卡片组件
react native·react.js·harmonyos
天人合一peng2 小时前
Unity中button 和toggle监听事件函数有无参数
前端·unity·游戏引擎
方也_arkling3 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
毕设源码-朱学姐3 小时前
【开题答辩全过程】以 基于web教师继续教育系统的设计与实现为例,包含答辩的问题和答案
前端
qq_177767373 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_177767374 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
web打印社区4 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
RFCEO4 小时前
前端编程 课程十三、:CSS核心基础1:CSS选择器
前端·css·css基础选择器详细教程·css类选择器使用方法·css类选择器命名规范·css后代选择器·精准选中嵌套元素